【问题标题】:MinGW on Cygwin. Some issues on linking the GNU Scientific LibraryCygwin 上的 MinGW。关于链接 GNU 科学图书馆的一些问题
【发布时间】: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.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。

【问题讨论】:

  • 你有静态库吗?你提到你有libgsl.dll.a,那libgsl.a呢?
  • @ssbssa 我没有。我认为 libgsl.dll.a 是正确的库文件,因为它的扩展名是 .a。显然不可能从任何 cywin 包安装 ligsl.a。我将尝试手动安装 GSL。

标签: c++ cygwin mingw static-linking gsl


【解决方案1】:

尝试添加 -static。如果没有相应的标志,链接 DLL 可能不会生成对库的静态依赖。 通常也不需要链接 stdc++。 (与 -W 一样,.. 如果使用 -static。

【讨论】:

  • 我已经尝试过了,但得到的结果与上面的更新中描述的结果完全相同
【解决方案2】:

我解决了这个问题。目前通过 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。现在我可以使用 GSL 为 32 位和 64 位交叉编译程序,并且我可以静态链接库,只需添加 -static 标志

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2013-10-31
    • 2014-12-17
    • 2023-03-06
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多