2013-05-15 41 views
5

我試圖用mingw64打造GDAL-1.10.0 (http://trac.osgeo.org/gdal/wiki/DownloadSource)(從 http://sourceforge.net/projects/mingwbuilds/files/host-windows/ x64-4.8.0釋放小POSIX的SEH-rev2.7z )。我在 標準MinGW(32位)版本下編譯了gdal-1.10.0,沒有問題。鏈接出錯(MinGW的-版本)

我之所以要切換到mingw64是,標準的32位的MinGW分佈 不支持C++ 11層的功能,如std::thread,和(I懷疑)其它特徵 好。但我得到最終的連接錯誤,告訴我一些關於

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動態鏈接庫文件的正確版本不能因爲 窗口會根據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. 我在Windows Server 2008 R2(64位)上測試此項。


更新: 爲MinGW64下建立@中-1.10.0(MinGW的-版本)完整的操作步驟是:

$./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/ 

回答

4

我不小心遇到了同樣的問題。 也許這是一個MinGW的錯誤或錯誤的配置文件,但解決的辦法是 -liconv添加到鏈接標誌的結束,例如,更換

CONFIG_LIBS = $(GDAL_ROOT)/$(LIBGDAL) 

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

在GDALmake.opt文件(通過在文件中搜索Mingw目錄中的GetACP來找到)。

+0

這很好。使用x64-4.8.1-release-posix-seh-rev0(mingw-builds)進行測試。注意:似乎GDALmake.opt中已經有一個-liconv。但是,不知怎的,它在MinGW64(每個版本)下都沒有找到。 – tinlyx

+0

那麼,爲什麼會出現這個錯誤? –