由于项目需要包含RTreeIntersects的函数,而Gaia官网只提供不含RTreeIntersects的各平台库文件,只好自己编译一个包含RTreeIntersects的Win dll文件。
编译过程遇到了杂七杂八的问题,以下逐一列举,方便下次编译:
1、编译工具。(libspatialite只提供Makefile、Configure、Makefile.vc,不含具体工程文件)
2、编译工程需要用到的第三方工程的头文件、静态库、动态库。(不推荐使用Gaia官网中推荐的第三方工程文件)
3、修改RTreeIntersects的配置。
4、编译32、64位的Win7 VS2010的lib、dll文件
5、64编译过程才会出现的问题
逐一说明,以上问题的解决方法:
1、编译工具
a、在Windows系统下,编译lib、dll建议用VS(VirtualStudio的命令行工具编译),安装完VS后,可在”开始“菜单的VS目录下找到“Virsual Studio Tools”中找到,“Virsual Studio 命令提示”(编译32位库文件使用)、“Virsual Studio X64命令提示”(编译64位库文件使用)。执行编译前,先在命令行(CMD)中定位到工程目录下,再执行nmake /f makefile.vc。PS:编译32位时无需修改配置,编译64位时需要修改编译配置文件。
b、libspatialite的VS编译过程,涉及nmake.opt、config-msvc.h、makefile.vc。为了编译包含RTreeIntersects,必须将config-msvc.h文件中的OMIT_GEOCALLBACKS宏定义注释掉。 编译32位库文件仅需要修改config-msvc.h。若要编译64位库文件,还需要修改nmake.opt,在OPTFLAGS中添加-D_X64
# Directory tree where SpatiaLite will be installed. INSTDIR=C:\OSGeo4W # Uncomment the first for an optimized build, or the second for debug. OPTFLAGS= /nologo /Ox /fp:precise /W3 /MD -D_X64 /D_CRT_SECURE_NO_WARNINGS \ /DDLL_EXPORT #OPTFLAGS= /nologo /Zi /MD /Fdspatialite.pdb /DDLL_EXPORT # Set the version number for the DLL. Normally we leave this blank since # we want software that is dynamically loading the DLL to have no problem # with version numbers. VERSION=
2、编译工程需要用到的第三方工程的头文件、静态库、动态库
libspatialite编译过程涉及到第三方工程的内容,建议直接下载OSGeo4W网站中的32、64包,可节省不少时间。OSGeo4W使用默认安装,可直接跟nmake.opt编译条件对应上。
3、修改RTreeIntersects的配置
RTreeIntersects的配置对应着config-msvc.h中的OMIT_GEOCALLBACKS宏。如果觉得自己没看到,可以文件搜索一下RTreeIntersects对应的宏,不过要注意:RTreeIntersects对应的是#ifndef OMIT_GEOCALLBACKS,所以只要注释掉OMIT_GEOCALLBACKS宏便可。
4、编译32、64位的Win7 VS2010的lib、dll文件
准备好以上三个条件后,就可以在VS 的命令行中编译了,若在编译过程中遇到缺少某个头文件或库文件,直接在makefile.vc的CFLAGS后添加路径便可,类似:
CFLAGS = /nologo -I.\src\headers -I. -IC:\OSGeo4W64\include $(OPTFLAGS) -IC:\OSGeo4W64\apps\grass\grass-6.4.3\include\ -IC:\OSGeo4W64\include\libxml2
5、编译64位库文件的问题(编译64位时,需要修改配置文件中的两处,分别是nmake.opt中添加-D_X64,厚实makefile.vc中添加/force)
在编译64位的库文件,编译到最后时,还会遇到部分函数重复定义的问题。我在命令行makefile.vc中添加了/force便可编译过(但是听同事说,最后的库似乎不太稳定,呵呵,自己没试过)。
spatialite_i.lib: $(LIBOBJ) link /debug /dll /force /out:$(SPATIALITE_DLL) \ /implib:spatialite_i.lib $(LIBOBJ) \ C:\OSGeo4W64\lib\proj.lib C:\OSGeo4W64\lib\geos_c.lib \ C:\OSGeo4W64\lib\freexl_i.lib C:\OSGeo4W64\lib\iconv.lib \ C:\OSGeo4W64\lib\sqlite3_i.lib
6、编译过程若出现“找不到unistd.h"文件
此文件可在C:\OSGeo4W\include\ogdi中找到,将此路径添加到makefile.vc中即可