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

时间:2013-05-15 07:06:25

标签: linker configure gdal wow64 mingw-w64

我正在尝试构建gdal-1.10.0 (http://trac.osgeo.org/gdal/wiki/DownloadSource)使用mingw64(来自 http://sourceforge.net/projects/mingwbuilds/files/host-windows/ x64-4.8.0释放小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的-版本)。顺便说一句,我尝试了不同版本的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位还是32位 拨打电话的64位应用程序。这对于mingw64来说应该是一个问题 因为编译器gcc是64位,但msys绝对是32位。

但是,由于我也试过32位版本,上面似乎没有解释 错误。 更进一步,我试着用一种肮脏的方式来评论对GetACP()的所有电话, 因为我并不真正关心代码页以及所有这些用于我的目的。 奇怪的是,编译是可以的(在GetACP()被注释掉的新资源上),但仍然报告了相同的链接错误。我检查了libkernel32.alibiconv.a是否在lib文件夹中,并且还按照上面博客中的说明将dll从 c:\windows\system32并将它们放在具有适当重命名的mingw子文件夹中。链接错误仍然存​​在。这是我花了差不多两天没有成功就停止了黑客攻击的地方。我无法理解为什么整个源代码不包含对函数的单个调用,我仍然会收到链接错误。

任何人都可以解释gdal和mingw64之间可能导致此问题的原因, 以及如何解决它?

此外,关于mingw64的一般问题是它真的能够支持 posix函数?我看到包名如 x64-4.8.0-release-posix-seh-rev2.7z,但我记得MinGW的人说过 他们永远不会支持完整的posix。

P.S。 我正在64位Windows Server 2008 R2上测试它。


更新: 在MinGW64(mingw-builds)下构建gdal-1.10.0的完整步骤是:

$./configure

然后, 编辑GDALmake.opt,查找GDAL_ROOT并用dos / mingw格式替换cygwin驱动器格式,例如: 变化:

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/

1 个答案:

答案 0 :(得分:5)

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

CONFIG_LIBS =   $(GDAL_ROOT)/$(LIBGDAL)   

CONFIG_LIBS =   $(GDAL_ROOT)/$(LIBGDAL)   -liconv
GDALmake.opt文件中的

(通过在文件中搜索Mingw目录中的GetACP找到)。