在mingw64 (mingw-builds)下使用GetACP链接错误



我正在尝试构建gdal-1.10.0(http://trac.osgeo.org/gdal/wiki/DownloadSource)使用mingw64 (fromhttp://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发行版不支持像std::thread这样的c++11特性,以及(我怀疑)其他特性如好。但是最后出现了一个链接错误告诉我关于

的一些信息
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根据上面的网站,似乎他们建议的问题与WOW64和正确版本的windows dll文件不能使用,因为Windows会根据是32位还是64位应用程序进行调用。这应该是mingw64的问题因为编译器GCC是64位的,而msys是无可救药的32位。

但是由于我也尝试了32位版本,上面的解释似乎无法解释这个错误。更重要的是,我试图用一种肮脏的方式注释掉所有对GetACP()的调用,因为我并不关心代码页和我的目的。奇怪的是,编译是正常的(在一个新的源代码上,只是把GetACP()注释掉了),但是仍然报告相同的链接错误。我检查了libkernel32.a, libiconv.alib文件夹中,并按照上面博客中的说明将dll从其中复制出来c:windowssystem32并将它们放在mingw子文件夹中,并进行适当的重命名。链路错误仍然存在。这是我在花了近两天时间没有成功后停止黑客攻击的地方。我不明白为什么整个源代码不包含对函数的单个调用,我仍然得到链接错误。

谁能解释一下gdal和mingw64之间的问题?如何解决这个问题?

另外,关于mingw64的一个普遍问题是它是否真的能够支持posix功能?我看到包的名称如x64-4.8.0-release-posix-seh-rev2.7z,但我记得MinGW的人说它们永远不会支持全posix。

注:我正在64位的Windows Server 2008 R2上进行测试。


更新:在MinGW64下构建gdal-1.10.0的完整步骤如下:

$./configure

,编辑GDALmake。找到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/

我偶然遇到了同样的问题。也许这是一个MinGW错误或坏的配置文件,但解决方案是添加-liconv到链接器标志的末尾,例如,替换

CONFIG_LIBS =   $(GDAL_ROOT)/$(LIBGDAL)   

CONFIG_LIBS =   $(GDAL_ROOT)/$(LIBGDAL)   -liconv
在GDALmake

最新更新