我正在尝试构建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.a
,libiconv.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/
答案 0 :(得分:5)
我偶然遇到了同样的问题。 也许这是一个MinGW错误或错误的配置文件,但解决方案是添加 -liconv 到链接器标志的末尾,例如,替换
CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL)
带
CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL) -liconv
GDALmake.opt文件中的(通过在文件中搜索Mingw目录中的GetACP找到)。