首页 文章

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

提问于
浏览
7

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

我必须切换到mingw64的原因是标准的32位MinGW发行版不支持c11功能,如 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() 的调用,因为我并不真正关心代码页以及所有这些用于我的目的 . 奇怪的是,编译是可以的(在一个新的来源只是_2955971的注释掉了),但仍然报告了相同的链接错误 . 我检查了 libkernel32.alibiconv.a 是否在 lib 文件夹中,并且还按照上面博客中的说明从 c:\windows\system32 复制了dll,并将它们放在具有适当重命名的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并用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 回答

  • 5

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

    CONFIG_LIBS =   $(GDAL_ROOT)/$(LIBGDAL)
    

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

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

相关问题