编译包含RTreeIntersects的libspatialite库文件

来源:互联网 发布:java post 请求 编辑:程序博客网 时间:2024/05/16 10:21

由于项目需要包含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中即可