簡體   English   中英

在Cygwin上的MinGW。 鏈接GNU科學庫的一些問題

[英]MinGW on Cygwin. Some issues on linking the GNU Scientific Library

將GNU科學圖書館與Cygwin上的MinGW鏈接時,我遇到幾個問題。 讓我解釋一下情況。

我已經從Cygwin設置實用程序中安裝了MinGW和GSL。 路徑/usr/i686-w64-mingw32/sys-root/mingw/bin/包含:

gsl-config           libgfortran-3.dll                 libssp-0.dll
libatomic-1.dll      libgomp-1.dll                     libstdc++-6.dll
libblas.dll          libgomp-plugin-host_nonshm-1.dll  libvtv_stubs-0.dll
libcblas.dll         libgsl-19.dll                     libvtv-0.dll
libgcc_s_sjlj-1.dll  libquadmath-0.dll                 libwinpthread-1.dll

路徑/usr/i686-w64-mingw32/sys-root/mingw/include/包含所有GSL標頭。

路徑/usr/i686-w64-mingw32/sys-root/mingw/lib/包含文件libgsl.dll.alibgslcblas.dll.a等文件

如果我使用編譯

i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -lgsl -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm

它可以編譯而沒有任何問題,並且只要/usr/i686-w64-mingw32/sys-root/mingw/bin/已正確添加到PATH環境變量中,便可以運行該可執行文件。

讓我指出第一個奇怪的問題。 如果未設置PATH變量,則為了運行程序,必須將/usr/i686-w64-mingw32/sys-root/mingw/bin/所有文件復制到可執行文件所在的路徑中。 請注意,所有文件,不僅是GSL DLL,都是這樣。 這很奇怪,因為其他庫是靜態鏈接的。 確實,我有其他不使用GSL的程序,當我以與上述someGSLapp相同的方式將它們靜態鏈接到標准庫時,可以在不設置PATH的情況下運行它們,也無需復制任何DLL。

當我嘗試靜態鏈接GSL時,會發生第二個問題。 如果我嘗試:

i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm -lgsl

GNU鏈接器返回錯誤cannot find -lgsl 我試圖添加

-I/usr/i686-w64-mingw32/sys-root/mingw/include/
-L/usr/i686-w64-mingw32/sys-root/mingw/lib/

但它並沒有改變任何東西,我仍然遇到相同的錯誤。

那么,關於第一個問題,誰能解釋為什么我需要復制所有DLL? 我的初步解釋是GSL DLL需要其他,但我不明白為什么甚至需要fortran DLL。

關於第二個問題,誰能告訴我如何靜態鏈接GSL?

關於第二期的更新

如果我使用靜態鏈接

i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm -lgsl.dll

我沒有得到該錯誤, cannot find -lgsl了,編譯和鏈接終止而沒有任何錯誤或警告,但是如果我未設置PATH或復制所有DLL,則可執行文件仍然無法運行,如上所述。 似乎靜態鏈接不適用於GSL。

嘗試添加-static。 如果沒有,則鏈接DLL可能不會在沒有相應標志的情況下對庫產生靜態依賴關系。 通常也不需要鏈接stdc ++。 (和-W一樣。.如果使用-static。

我解決了問題。 似乎當前可以通過Cygwin設置實用程序使用的預編譯GSL軟件包不允許靜態鏈接庫。 實際上,正如@ssbssa在評論中注意到的那樣,他們沒有安裝libgsl.a。

這就是我所做的。 首先,我完全刪除了先前安裝的所有GSL軟件包。 我從GSL主存儲庫ftp://ftp.gnu.org/gnu/gsl/下載了該庫的最新版本到本地路徑。

GNU make必須已經安裝。 我用了

./configure CC=x86_64-w64-mingw32-gcc --prefix=/usr/gsl/mingw64/

CC設置要使用的編譯器。 --prefix設置庫將安裝到的路徑。 然后我打電話給make並在完成編譯后立即make install

由於我還需要為32位系統編譯程序,因此我調用make clean開始新安裝,然后設置

./configure CC=i686-w64-mingw32-gcc --prefix=/usr/gsl/mingw32/

然后再次makemake install 現在,我可以使用32位和64位GSL交叉編譯程序,並且只需添加-static標志即可靜態鏈接庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM