7

我试图使用mingw64(来自 http://sourceforge.net/projects/mingwbuilds/files/host-windows/x64 )构建 gdal -1.10.0( http://trac.osgeo.org/gdal/wiki/DownloadSource ) -4.8.0-release-posix-seh-rev2.7z)。我在标准MinGW(32位)版本下编译gdal-1.10.0没有问题。

我必须切换到 mingw64 的原因是标准的 32 位 MinGW 发行版不支持 c++11 等功能std::thread,以及(我怀疑)其他功能。但我最后得到一个链接错误告诉我一些关于

undefined reference to '__imp_GetACP'

(或者如果我使用来自 mingw64/mingw-builds 的 32 位变体,则使用不同的修饰名称)。顺便说一句,我尝试了不同版本的 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.alibiconv.alib文件夹中,并按照上面博客中的说明从 c:\windows\system32并将它们放置在具有适当重命名的 mingw 子文件夹中。链接错误仍然存​​在。这就是我在花了将近两天没有成功之后停止黑客攻击的地方。我不明白为什么整个源代码不包含对该函数的单个调用,而且我仍然收到链接错误。

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

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

PS 我正在 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

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/
4

1 回答 1

6

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

CONFIG_LIBS =   $(GDAL_ROOT)/$(LIBGDAL)   

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

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

于 2013-06-06T06:12:25.300 回答