最近需要用到 spatialite,打算在 Windows 下自己编译 libspatialite。官网上有 MinGW how-to、 MinGW64 how-to 和 MSVC how-to 的教程。由于个人喜好,选择用 MSVC。实际操作起来,才发现官方的教程,基于 OSGeo4W,描述过于简略。当然,如果只是实际使用,还是强烈推荐 OSGeo4W,不用自己编译,安装后有现成的静态库和动态库可供使用。但既然打算自己编译,还是想从依赖库开始。折腾了好久,这里做一个记录。
其实折腾最久的就是刚开始编译的这个 libiconv。libiconv 从貌似从版本 1.11 以后就不支持 namke 编译了。本来都放弃了自己喜欢用最新稳定版这个陋习,打算勉强用 1.11 这个版本,结果在 VS 2015 下还编译失败了。好在找到了 《How to Build libiconv with Microsoft Visual Studio》,并且按照此文的方法也能够编译目前最新的 1.15 版本。
版本
Visual Studio: 2015
libiconv: 1.15
编译生成
第 1 步
下载 libiconv。原教程版本是 1.14,这里用的 1.15 也能成功生成,其他版本没有实际测试过。
第 2 步
用 Visual Studio 新建 Win32 工程,这里命名工程为 libiconv。在设置向导中选择 Application type 为 DLL,并在 Additional options 中勾选 Empty project。
第 3 步
解压下载的 libiconv-1.15.tar.gz。复制以下文件:
- 从解压的文件夹 …\libiconv-1.15\lib\ 中,复制 relocatable.h、relocatable.c、iconv.c 到工程文件夹 …\libiconv\libiconv\ 中。
- 从解压的文件夹 …\libiconv-1.15\libcharset\lib\ 中,复制 localcharset.c 到工程文件夹 …\libiconv\libiconv\ 中。
- 从解压的文件夹 …\libiconv-1.15\libcharset\include\ 中,复制 localcharset.h.build.in 到工程文件夹 …\libiconv\libiconv\ 中,并重命名为 localcharset.h。
- 从解压的文件夹 …\libiconv-1.15\windows\ 中,复制 libiconv.rc 到工程文件夹 ..\libiconv\libiconv\ 中。
- 在工程文件夹 ..\libiconv\ 中创建文件夹 include。
- 从解压的文件夹 …\libiconv-1.15\include\ 中,复制 iconv.h.build.in 到工程文件夹 ..\libiconv\include\ 中,并重命名为 iconv.h。
- 从解压的文件夹 …\libiconv-1.15\ 中,复制 config.h.in 到工程文件夹 ..\libiconv\include\ 中,并重命名为 config.h。
- 从解压的文件夹 …\libiconv-1.15\lib\ 中,复制所有的头文件(*.h)和所有的定义文件(*.def)到工程文件夹 …\libiconv\include\ 中。
第 4 步
点击菜单 Project > Add Existing item…,将之前复制到工程文件夹 …\libiconv\libiconv 中的文件加入工程。
第 5 步
设置工程属性。在设置时,可选择 All Configurations 和 All Platforms,实际编译生成时,可根据需要选择 Debug 或 Release,x86 或 x64。
选择 Configuration Properties > General,设置 Output Directory 为 $(SolutionDir)$(Configuration)_$(Platform)\,设置 Intermediate Directory 为 $(SolutionDir)obj\$(ProjectName)\$(Configuration)_$(Platform)\。
选择 Configuration Properties > VC++ Directories,为 Include Directories 添加路径 ..\include。
选择 Configuration Properties > C/C++ > Preprocessor,为 Preprocessor Definitions 添加 BUILDING_LIBICONV 和 BUILDING_LIBCHARSET。
选择 Configuration Properties > C/C++ > Code Generation,设置 Runtime Library 为 Multi-threaded(/MT)。原文指出这里是编译动态库的推荐设置,只编译静态库可根据实际情况设置。
选择 Configuration Properties > C/C++ > Precompiled Headers,设置 Precompiled Header 为 Not Using Precompiled Headers。
第 6 步
需要对源代码进行一些修改。
libiconv.rc
在第 4 行插入代码:
|
localcharset.c
注释 81 - 83 行:
|
|
iconv.c
修改 250 - 252 行:
|
|
localcharset.h
修改 21 - 25 行:
|
|
config.h
在 …\libiconv\include\ 中打开,注释 30 行:
|
|
iconv.h
在 …\libiconv\include\ 中打开,修改 174 行:
|
|
修改 127 行:
|
|
修改 106 - 107 行:
|
|
修改 88 行:
|
|
修改 25 - 30 行:
|
|
使用
使用时,需要 …\libiconv\include\ 中的 iconv.h。根据使用需要,可在编译生成的输出文件夹中找到 libiconv.lib 和 libiconv.dll。
许可
鉴于本文是照搬的,为尊重原文,与原文一样,本文及其相关的代码遵循 The GNU Lesser General Public License (LGPLv3)。