我试图使用mingw64(来自 http://sourceforge.net/projects/mingwbuilds/files/host-windows/x64 )构建 gdal -1.10.0( http://trac.osgeo.org/gdal/wiki/DownloadSource ) -4.8.0-release-posix-seh-rev2.7z)。我在标准MinGW(32位)版本下编译gdal-1.10.0没有问题。
我必须切换到 mingw64 的原因是标准的 32 位 MinGW 发行版不支持 c++11 等功能std::thread
,以及(我怀疑)其他功能。但我最后得到一个链接错误告诉我一些关于
undefined reference to '__imp_GetACP'
(或者如果我使用来自 mingw64/mingw-builds 的 32 位变体,则使用不同的修饰名称)。顺便说一句,我尝试了不同版本的 mingw64,包括 64 位、32 位、seh、sjlj,但都给出了关于GetACP()
.
我做了一些功课,发现了一些类似编译任务的说明: http ://www.gaia-gis.it/spatialite-3.0.0-BETA/mingw64_how_to.html#env 根据上面的网站,似乎他们建议问题与 WOW64 有关,并且无法使用正确版本的 windows dll 文件,因为 windows 会根据发出调用的 32 位或 64 位应用程序自动为您确定它。这应该是 mingw64 的一个问题,因为编译器 gcc 是 64 位的,但 msys 是无可救药的 32 位。
但是由于我也尝试了 32 位版本,所以上面似乎并不能解释错误。更重要的是,我试图以一种肮脏的方式注释掉对 的所有调用GetACP()
,因为我并不真正关心代码页以及所有这些出于我的目的。奇怪的是,编译是可以的(在一个新的源代码上,只是GetACP()
注释掉了 '),但仍然报告了相同的链接错误。我检查了libkernel32.a
,libiconv.a
在lib
文件夹中,并按照上面博客中的说明从
c:\windows\system32
并将它们放置在具有适当重命名的 mingw 子文件夹中。链接错误仍然存在。这就是我在花了将近两天没有成功之后停止黑客攻击的地方。我不明白为什么整个源代码不包含对该函数的单个调用,而且我仍然收到链接错误。
谁能解释在 gdal 和 mingw64 之间可能导致此问题的原因,以及如何解决?
另外,关于 mingw64 的一个普遍问题是它真的能够支持 posix 函数吗?我看到包名称,例如 x64-4.8.0-release-posix-seh-rev2.7z,但我记得 MinGW 的人说他们永远不会支持完整的 posix。
PS 我正在 Windows Server 2008 R2,64 位上测试这个。
更新:在 MinGW64 (mingw-builds) 下构建 gdal-1.10.0 的完整步骤是:
$./configure
然后,编辑GDALmake.opt,找到GDAL_ROOT,将cygwin驱动格式替换为dos/mingw格式,例如更改:
GDAL_ROOT = /d/temp/build/gdal-1.10.0
到
GDAL_ROOT = d:/temp/build/gdal-1.10.0
代替
CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL)
和
CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL) -liconv
最后,
$ make && make install && cp apps/*.exe /usr/local/bin/