在Windows x64下使用带有MinGW的GNU Scientific Library(GSL)

AlQ*_*ist 10 windows mingw linker-errors gsl

我在Microsoft Windows(64位),内部目录C:\MinGW(MSYS目录是C:\MinGW\msys\1.0)上安装了MinGW和MSYS .我从官方ftp下载了最新的GNU Scientific Library(GNU GSL)软件包.

我已经使用MSYS执行configuremake成功执行INSTALLGSL包中的文件.这意味着,在MSYS命令行界面的MSYS home目录中,我插入了:

$ ./configure
$ make
$ make install
Run Code Online (Sandbox Code Playgroud)

这产生了local在MSYS目录(目录下C:\MinGW\msys\1.0),包括目录bin,include,lib,和share.

我已经成功地编译的示例程序(其计算为$贝塞尔函数$ J_0(x)的$ x值= $ 5)根据在所述指令GSL手册,由

$ gcc -Wall -I/usr/local/include -c example.c
Run Code Online (Sandbox Code Playgroud)

这会产生一个目标文件example.o,如预期的那样,没有任何错误消息.

目标文件被链接,根据指令通过

$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
Run Code Online (Sandbox Code Playgroud)

这将生成一个a.exe可在MSYS环境中执行的可执行文件.但是,在Windows命令行界面中cmd.exe,尝试运行可执行文件会出现以下错误消息:

程序无法启动,因为您的计算机缺少libgsl-0.dll.尝试重新安装该程序以解决此问题.

我想知道遗失了什么?应该怎么做才能生成可执行文件?

Kei*_*all 7

当您为MinGW构建项目时,在MSYS下,您应该始终指定一个--prefix参数./configure; (/usr/local默认值指定MSYS特定路径,这完全不适合MinGW应用程序开发).在您的情况下,您应该已经配置了GSL:

./configure --prefix=C:/MinGW
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,将构建文件与源隔离(例如,作为GSL顶级源目录的子目录):

mkdir build
cd build
../configure --prefix=C:/MinGW
Run Code Online (Sandbox Code Playgroud)

这确保了程序包安装的所有库和头文件都位于相应的目录中,MinGW可以在其中找到它们,更重要的是%PATH%,当在MSYS外部运行时,搜索找到安装的DLL的位置.

通过配置,随后运行

make
make install
Run Code Online (Sandbox Code Playgroud)

你已经安装了由MSYS使用的MinGW库和头文件(这是错误的),特别是它libgsl-0.dll已安装到C:/MinGW/msys/1.0/local/bin,而它应该C:/MinGW/bin,(后面的命令安装它的地方,在配置后使用适当的--prefix=C:/MinGW规范).

重要的脚注

您应该注意,上述过程将正确准备GSL(或以类似方式准备的任何其他库),以便与MinGW一起使用,并允许您运行与开发主机上的此类库链接的应用程序(或在具有类似MinGW安装的任何其他主机上).但是,如果您希望分发此类应用程序(并且只要您遵守任何许可条件),那么它们可以作为独立应用程序运行(即,无需在最终用户的计算机上安装MinGW),必须注意在您的发行版中将正确地满足运行时依赖性.要实现这一目标,您必须选择:

  1. 静态链接应用程序.如果您的发行版仅限于一个或两个可执行文件,这可能是合适的,但随着可分发应用程序套件中具有共同核心库依赖性的可执行文件数量的增加,这将很快导致"可执行膨胀".在后一种情况下,更好的选择是
  2. 动态链接应用程序,并分发任何必要的DLL(系统DLL除外)的副本以及应用程序套件; 在这种情况下,您不应对目录布局或%PATH%设置做出任何假设,这些假设可能适用于最终用户的机器,也可能不适用; 您应该简单地打包您的发行版,以便将所有交付的可执行文件及其附带的DLL安装到同一个目录中.


Joa*_*m W 5

作为参考,请注意,以前的所有答案都已过时。对于 Win64,MinGW 和 MSYS 已被独立项目 Mingw-w64 和 MSys2 取代。并且不再需要自己编译 GSL:使用https://packages.msys2.org/package/mingw-w64-x86_64-gsl中的二进制文件。