在Windows x64下使用GNU Scientific Library(GSL)和MinGW

时间:2015-05-03 15:30:39

标签: windows mingw linker-errors gsl

我在Microsoft Windows(64位)上安装了MinGW和MSYS,位于目录C:\MinGW内(MSYS目录为C:\MinGW\msys\1.0)。我从official ftp下载了最新的GNU Scientific Library( GNU GSL )包。

我已使用MSYS成功执行configuremake,如GSL包中的INSTALL文件所述。这意味着,在MSYS命令行界面的MSYS home目录中,我插入了:

$ ./configure
$ make
$ make install

这将在MSYS目录(local)下生成一个C:\MinGW\msys\1.0目录,其中包括目录binincludelibshare

我已根据example program中的说明成功编译了GSL manual(根据instructions中的说明计算了贝塞尔函数$ J_0(x)$的值,价值为$ x = 5 $) p>

$ gcc -Wall -I/usr/local/include -c example.c

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

根据{{3}}

链接目标文件
$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm

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

  

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

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

5 个答案:

答案 0 :(得分:7)

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

./configure --prefix=C:/MinGW

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

mkdir build
cd build
../configure --prefix=C:/MinGW

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

按照您的配置,随后运行

make
make install

你已经安装了MSG使用的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安装到同一个目录中。

答案 1 :(得分:1)

我发现了一个部分解决方案;但我不确切知道它为什么会起作用!

使用我在问题中最初提到的相同的过程和配置,如果使用Windows php app/console assetic:dump --env=prod --no-debug (CLI)并编译并链接C代码(cmd

example.c

或带有

的C ++代码(相当于gcc -c example.c -I"C:\MinGW\msys\1.0\local\include" -Wall gcc -static example.o -L"C:\MinGW\msys\1.0\local\lib" -lgsl -lgslcblas -lm
example.c

即,在链接中使用g++ -c example.cpp -I"C:\MinGW\msys\1.0\local\include" -Wall g++ -static example.o -L"C:\MinGW\msys\1.0\local\lib" -lgsl -lgslcblas -lm 选项,然后一切都很完美,最终的可执行文件运行时没有任何错误消息。因此,问题似乎与动态链接库有关。

如果我错了,请纠正我。

答案 2 :(得分:0)

可执行文件不在Windows cmd下运行,因为库 您编译的libgsl-0.dll不在系统或用户路径上。 Windows确实如此 不知道在哪里寻找它。直接的解决方案是告诉系统 通过编辑环境变量PATH来包含它的位置 libgsl-0.dll的位置。这可以通过输入

使用cmd来完成

PATH=PATH;path-to-libgsl-0.dll

命令行上的

。 (我不完全记得图书馆在哪里结束 请原谅我不具体。​​)这只会持续到会议, 但是,要使更改永久化,必须编辑PATH变量 通过控制面板。一种访问环境变量的方法 是通过单击“高级系统设置”,可以在左侧找到 通过单击控制面板 - >系统和安全性生成的窗口 - >系统或右键单击“开始”菜单中的“计算机”并选择 属性。单击“高级系统设置”将打开一个窗口 按钮“环境变量”显示,环境变量变为 点击该按钮即可访问。但是,为了编辑PATH,我愿意 建议使用免费软件实用程序“PathEditor.exe”,可以找到here。该实用程序使该过程更容易。

但是,您的构建设置远非最佳。使用 .configure步骤没有任何选项意味着生成的文件将 安装在C:\ MinGW \ msys \ 1.0 \ local下并分散几个 目录。如果要安装,将很难删除文件 安装后的更新版GSL 还有其他 开发库。我建议添加选项--prefix=C:/MinGW/gsl.configure步骤。 (对于一组完整的选项,运行.configure --help。) 这使得安装变得非常容易 如果需要,只需删除或重命名C:\ MinGW \ gsl即可。 此外,MSYS的目的是促进目标软件的构建 对于不是Windows方式的GNU系统。该软件曾经建成 不应该驻留在MSYS下,而是放在C:\ MinGW下的某个地方 可以进入 在C:\ MinGW \ bin中构建工具,用于构建本机Windows程序 使用cmd或其他合适的Windows工具。在实践中,这意味着 如果需要MSYS,应始终使用--prefix=C:/MinGW 构建在MinGW中使用的软件,就像在这种情况下GSL头文件和 库。但是,最好由于给出的原因选择--prefix=C:/MinGW/software

安装软件后,不要忘记编辑PATH以便系统 可以找到任何需要的库。

答案 3 :(得分:0)

不是那么简单。 gcc从bash shell中的LINUX命令提示符运行。 MinGW32-gcc从cmd.exe shell中的DOS命令提示符运行。执行需要动态链接库(DOS中的.dll或Linux中的.so .la)的程序所需的动态链接也取决于操作系统。 Linux动态库和Windows动态库不可互换。这是预期的;但是,在Linux'中由gcc和ld创建的静态库。 bash shell似乎与Windows中的MinGW32-gcc不兼容。 cmd.exe shell这让我很惊讶。我不能让MinGW32-gcc链接到libgsl.a;我一直从ld得到未解决的引用。我也无法弄清楚如何在cmd.exe shell中构建GSL。

答案 4 :(得分:0)

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