在Cygwin上将GNU科学库与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.a
和libgslcblas.dll.a
如果我使用
i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -lgsl -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm
它可以毫无问题地编译,并且只要正确添加到 PATH 环境变量/usr/i686-w64-mingw32/sys-root/mingw/bin/
可执行文件就可以运行。
让我指出第一个奇怪的问题。如果我不设置 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/
然后又make
和make install
.现在,我可以使用 GSL 交叉编译 32 位和 64 位的程序,并且只需添加-static
标志即可静态链接库