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