关于Cygwin的MinGW。关于连接GNU科学图书馆的一些问题

时间:2017-08-20 15:38:37

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

在Cygwin上将GNU Scientific Library与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需要其他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不起作用。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我解决了这个问题。目前可通过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标志