Cygwin 上的 MinGW。关于链接 GNU 科学图书馆的一些问题
MinGW on Cygwin. Some issues on linking the GNU Scientific Library
在 Cygwin 上使用 MinGW link使用 GNU 科学图书馆时,我遇到了几个问题。让我解释一下情况。
我已经从 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 headers。
路径 /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。这很奇怪,因为其他库是 link 静态编辑的。事实上,我还有其他不使用 GSL 的程序,当我以与上面对我的 someGSLapp 相同的方式静态编译它们时 linking 标准库,它们可以是 运行 而无需设置 PATH ,也不复制任何 DLL。
第二个问题发生在我尝试静态 link GSL 时。如果我尝试:
i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm -lgsl
GNU link错误 returns 错误 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都需要。
关于第二个问题,谁能告诉我如何静态link GSL?
更新第二期
如果我link静态使用
i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm -lgsl.dll
我不再收到错误 cannot find -lgsl
,编译和 linking 终止,没有任何错误或警告,但如果我不设置 PATH,可执行文件仍然不会 运行或如上所示复制所有 DLL。 static linking 似乎不适用于 GSL。
尝试添加-static。链接 DLL 可能不会在没有相应标志的情况下生成对库的静态依赖性(如果有的话)。
通常也不需要链接 stdc++。 (与 -W 一样,.. 如果使用 -static。
我解决了这个问题。目前通过 Cygwin 安装实用程序可用的预编译 GSL 包似乎不允许静态 link 库。事实上,正如@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 位交叉编译程序,并且我可以静态 link 库,只需添加 -static
标志
在 Cygwin 上使用 MinGW link使用 GNU 科学图书馆时,我遇到了几个问题。让我解释一下情况。
我已经从 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 headers。
路径 /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。这很奇怪,因为其他库是 link 静态编辑的。事实上,我还有其他不使用 GSL 的程序,当我以与上面对我的 someGSLapp 相同的方式静态编译它们时 linking 标准库,它们可以是 运行 而无需设置 PATH ,也不复制任何 DLL。
第二个问题发生在我尝试静态 link GSL 时。如果我尝试:
i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm -lgsl
GNU link错误 returns 错误 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都需要。
关于第二个问题,谁能告诉我如何静态link GSL?
更新第二期
如果我link静态使用
i686-w64-mingw32-g++.exe -std=c++11 -s someGSLapp.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -lm -lgsl.dll
我不再收到错误 cannot find -lgsl
,编译和 linking 终止,没有任何错误或警告,但如果我不设置 PATH,可执行文件仍然不会 运行或如上所示复制所有 DLL。 static linking 似乎不适用于 GSL。
尝试添加-static。链接 DLL 可能不会在没有相应标志的情况下生成对库的静态依赖性(如果有的话)。 通常也不需要链接 stdc++。 (与 -W 一样,.. 如果使用 -static。
我解决了这个问题。目前通过 Cygwin 安装实用程序可用的预编译 GSL 包似乎不允许静态 link 库。事实上,正如@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 位交叉编译程序,并且我可以静态 link 库,只需添加 -static
标志