我正在尝试构建 gdal-1.10.0
( http://trac.osgeo.org/gdal/wiki/DownloadSource )使用 mingw64(来自
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
根据上面的网站,似乎他们建议问题必须这样做
无法使用 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。
附言
我正在 64 位 Windows Server 2008 R2 上对此进行测试。
更新:
在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/
最佳答案
我不小心遇到了同样的问题。
也许这是一个 MinGW 错误或错误的配置文件,但解决方案是添加
-liconv 到链接器标志的末尾,例如,替换
CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL)
和
CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL) -liconv
在 GDALmake.opt 文件中(通过在文件中搜索 Mingw 目录中的 GetACP 找到)。
关于linker - mingw64 下的 GetACP 链接错误(mingw-builds),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16558813/