【发布时间】:2023-03-29 11:38:02
【问题描述】:
在 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
它编译没有任何问题,只要将/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。
【问题讨论】:
-
你有静态库吗?你提到你有
libgsl.dll.a,那libgsl.a呢? -
@ssbssa 我没有。我认为 libgsl.dll.a 是正确的库文件,因为它的扩展名是 .a。显然不可能从任何 cywin 包安装 ligsl.a。我将尝试手动安装 GSL。
标签: c++ cygwin mingw static-linking gsl