在 Windows x64 下使用 GNU 科学库 (GSL) 和 MinGW
Using GNU Scientific Library (GSL) under Windows x64 with MinGW
我已经在 Microsoft Windows(64 位)目录 C:\MinGW
中安装了 MinGW 和 MSYS(MSYS 目录是 C:\MinGW\msys.0
)。我已经从 official ftp.
下载了最新的 GNU 科学库 (GNU GSL) 包
我已经使用 MSYS 成功执行了 configure
和 make
,如 GSL 包中 INSTALL
文件中所述。这意味着,在 MSYS 命令行界面中,在 MSYS home
目录中,我插入了:
$ ./configure
$ make
$ make install
这会在 MSYS 目录 (C:\MinGW\msys.0
) 下生成一个 local
目录,包括目录 bin
、include
、lib
和 [=25] =].
我已经成功编译了example program (which computes the value of the Bessel function $J_0 (x)$ at $x = 5$) according to the instructions in the GSL manual,作者
$ gcc -Wall -I/usr/local/include -c example.c
这会产生目标文件 example.o
,正如预期的那样,没有任何错误消息。
目标文件被链接,根据instructions by
$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
这会生成一个可执行文件 a.exe
,可以在 MSYS 环境中执行。
但是,在 Windows 命令行界面 cmd.exe
中,尝试 运行 可执行文件会给出以下错误消息:
The program can't start because libgsl-0.dll is missing from your computer. Try reinstalling the program to fix this problem.
我想知道缺少什么?如何生成可执行文件?
当您在 MSYS 下为 MinGW 构建项目时,您应该始终 为 ./configure
指定一个 --prefix
参数; (/usr/local
默认指定一个 MSYS 特定路径,这完全不适合 MinGW 应用程序开发)。在您的情况下,您应该这样配置 GSL:
./configure --prefix=C:/MinGW
或者,更好的是,将构建文件与源分开,(例如作为 GSL 顶级源目录的子目录):
mkdir build
cd build
../configure --prefix=C:/MinGW
这确保所有库和包安装的 headers 都位于适当的目录中,MinGW 可以在其中找到它们,更重要的是,安装的 DLL 可以通过 %PATH%
搜索找到,当 运行在 MSYS 之外时。
像你一样配置,当你随后运行
make
make install
您已经安装了 MinGW 库和 headers 供 MSYS 使用(这是错误的),特别是 libgsl-0.dll
将安装到 C:/MinGW/msys/1.0/local/bin
,而它 应该在C:/MinGW/bin
,(这是后一个命令会安装它的地方,按照适当的--prefix=C:/MinGW
配置规格)。
重要脚注
您应该注意,前面的过程将正确准备 GSL(或以类似方式准备的任何其他库)以用于 MinGW,并允许您 运行 您已链接的应用程序在您的开发主机上(或在具有类似 MinGW 安装的任何其他主机上)这样的库。但是,如果您希望分发此类应用程序(并且前提是您遵守任何许可条件),那么它们可能 运行 和 free-standing 应用程序一样(即不要求 MinGW 安装在最终用户的机器),您 必须 注意 运行 时间依赖性将在您的分发中得到适当满足。为此,您必须选择:
- Link 应用程序 静态 。如果您的分发仅限于一个或两个可执行文件,这可能是合适的,但随着可分发应用程序套件中具有共同核心库依赖性的可执行文件数量的增加,这将很快导致 "executable bloat"。在后一种情况下,更好的选择是
- Link 应用程序 动态地 ,并与应用程序套件一起分发任何必要的 DLL(系统 DLL 除外)的副本;在这种情况下,您不应该对目录布局或
%PATH%
设置做出任何假设,这些设置可能适用于最终用户的计算机,也可能不适用;您应该简单地打包您的发行版,以便所有交付的可执行文件及其随附的 DLL 将安装到 同一个 目录中。
我也找到了部分解决方案;但我不知道它为什么有效!
使用我最初在问题中提到的相同过程和配置,如果使用Windows cmd
(CLI)并且编译和链接C 代码 (example.c
) 和
gcc -c example.c -I"C:\MinGW\msys.0\local\include" -Wall
gcc -static example.o -L"C:\MinGW\msys.0\local\lib" -lgsl -lgslcblas -lm
或具有
的C++代码(相当于example.c
)
g++ -c example.cpp -I"C:\MinGW\msys.0\local\include" -Wall
g++ -static example.o -L"C:\MinGW\msys.0\local\lib" -lgsl -lgslcblas -lm
即,在链接中使用 -static
选项,然后一切正常,最终的可执行文件运行时没有任何错误消息。所以,问题似乎与库的动态链接有关。
如有错误请指正
可执行文件不会 运行 在 windows cmd
下,因为库
您编译的 libgsl-0.dll 不在系统或用户路径上。 Windows 确实
不知道去哪里找。直接的解决办法是告诉系统
通过编辑环境变量 PATH 以包含
libgsl-0.dll 的位置。这可以通过输入
使用 cmd
完成
PATH=PATH;path-to-libgsl-0.dll
在命令行上。 (我不记得图书馆在哪里结束了,所以
请原谅我不具体。)这只会持续 session,
但是,要使更改永久化,必须通过以下方式编辑 PATH 变量
通过控制面板。访问环境变量的一种方法
通过单击 "Advanced system settings" 可以在左侧找到
window 通过点击控制面板->系统和安全得到
->System 或通过 right-clicking 在计算机上的开始菜单中选择
特性。单击 "Advanced system settings" 打开一个 window,其中
按钮 "Environment Variables" 出现,环境变量变为
单击该按钮即可访问。不过,要编辑 PATH,我会
建议使用可以在 here 找到的免费软件实用程序 "PathEditor.exe"。该实用程序使该过程更加容易。
不过,您的构建设置远非最佳。使用
.configure
没有任何选项的步骤意味着生成的文件将
安装在 C:\MinGW\msys.0\local 下,分布在几个
目录。如果您想安装,将很难删除文件
安装后更新版本的 GSL
还有其他
开发库。我建议添加选项 --prefix=C:/MinGW/gsl
到 .configure
步骤。 (对于一组完整的选项 运行 .configure --help
。)
这使得安装变得非常容易
如果需要,只需删除或重命名 C:\MinGW\gsl 即可。
此外,MSYS 的目的是促进有针对性的软件构建
对于 GNU 系统,这不是 Windows 方式。软件一旦构建
不应驻留在 MSYS 下,而应驻留在 C:\MinGW 下的某个位置并制作
可访问的
C:\MinGW\bin 中的构建工具,用于构建本机 Windows 程序
使用 cmd
或其他合适的 Windows 工具。实际上这意味着
如果需要 MSYS,则应始终使用 --prefix=C:/MinGW
构建要在 MinGW 中使用的软件,在本例中为 GSL 头文件和
图书馆。不过,出于给定的原因,最好选择 --prefix=C:/MinGW/software
.
安装软件后不要忘记编辑PATH,以便系统
可以找到任何需要的库。
没那么简单。 gcc 在 bash shell 中从 LINUX 命令提示符运行。 MinGW32-gcc 从 cmd.exe shell 中的 DOS 命令提示符运行。执行需要动态 link 库(DOS 中的 .dll 或 Linux 中的 .so .la)的程序所需的动态 linking 也是 OS 依赖。 Linux 动态库和 Windows 动态库不可互换。这是意料之中的事;但是,Linux' bash shell 中 gcc 和 ld 创建的静态库似乎与 Windows' cmd.exe [=27= 中的 MinGW32-gcc 不兼容] 这让我很惊讶。我无法将 MinGW32-gcc 设置为 link 至 libgsl.a;我一直从 ld 收到未解决的引用。我也不知道如何让 GSL 在 cmd.exe shell.
中构建
作为参考,请注意,之前的所有答案均已过时。对于 Win64,MinGW 和 MSYS 已被独立项目 Mingw-w64 和 MSys2 取代。不再需要自己编译 GSL:使用来自 https://packages.msys2.org/package/mingw-w64-x86_64-gsl.
的二进制文件
我已经在 Microsoft Windows(64 位)目录 C:\MinGW
中安装了 MinGW 和 MSYS(MSYS 目录是 C:\MinGW\msys.0
)。我已经从 official ftp.
我已经使用 MSYS 成功执行了 configure
和 make
,如 GSL 包中 INSTALL
文件中所述。这意味着,在 MSYS 命令行界面中,在 MSYS home
目录中,我插入了:
$ ./configure
$ make
$ make install
这会在 MSYS 目录 (C:\MinGW\msys.0
) 下生成一个 local
目录,包括目录 bin
、include
、lib
和 [=25] =].
我已经成功编译了example program (which computes the value of the Bessel function $J_0 (x)$ at $x = 5$) according to the instructions in the GSL manual,作者
$ gcc -Wall -I/usr/local/include -c example.c
这会产生目标文件 example.o
,正如预期的那样,没有任何错误消息。
目标文件被链接,根据instructions by
$ gcc -L/usr/local/lib example.o -lgsl -lgslcblas -lm
这会生成一个可执行文件 a.exe
,可以在 MSYS 环境中执行。
但是,在 Windows 命令行界面 cmd.exe
中,尝试 运行 可执行文件会给出以下错误消息:
The program can't start because libgsl-0.dll is missing from your computer. Try reinstalling the program to fix this problem.
我想知道缺少什么?如何生成可执行文件?
当您在 MSYS 下为 MinGW 构建项目时,您应该始终 为 ./configure
指定一个 --prefix
参数; (/usr/local
默认指定一个 MSYS 特定路径,这完全不适合 MinGW 应用程序开发)。在您的情况下,您应该这样配置 GSL:
./configure --prefix=C:/MinGW
或者,更好的是,将构建文件与源分开,(例如作为 GSL 顶级源目录的子目录):
mkdir build
cd build
../configure --prefix=C:/MinGW
这确保所有库和包安装的 headers 都位于适当的目录中,MinGW 可以在其中找到它们,更重要的是,安装的 DLL 可以通过 %PATH%
搜索找到,当 运行在 MSYS 之外时。
像你一样配置,当你随后运行
make
make install
您已经安装了 MinGW 库和 headers 供 MSYS 使用(这是错误的),特别是 libgsl-0.dll
将安装到 C:/MinGW/msys/1.0/local/bin
,而它 应该在C:/MinGW/bin
,(这是后一个命令会安装它的地方,按照适当的--prefix=C:/MinGW
配置规格)。
重要脚注
您应该注意,前面的过程将正确准备 GSL(或以类似方式准备的任何其他库)以用于 MinGW,并允许您 运行 您已链接的应用程序在您的开发主机上(或在具有类似 MinGW 安装的任何其他主机上)这样的库。但是,如果您希望分发此类应用程序(并且前提是您遵守任何许可条件),那么它们可能 运行 和 free-standing 应用程序一样(即不要求 MinGW 安装在最终用户的机器),您 必须 注意 运行 时间依赖性将在您的分发中得到适当满足。为此,您必须选择:
- Link 应用程序 静态 。如果您的分发仅限于一个或两个可执行文件,这可能是合适的,但随着可分发应用程序套件中具有共同核心库依赖性的可执行文件数量的增加,这将很快导致 "executable bloat"。在后一种情况下,更好的选择是
- Link 应用程序 动态地 ,并与应用程序套件一起分发任何必要的 DLL(系统 DLL 除外)的副本;在这种情况下,您不应该对目录布局或
%PATH%
设置做出任何假设,这些设置可能适用于最终用户的计算机,也可能不适用;您应该简单地打包您的发行版,以便所有交付的可执行文件及其随附的 DLL 将安装到 同一个 目录中。
我也找到了部分解决方案;但我不知道它为什么有效!
使用我最初在问题中提到的相同过程和配置,如果使用Windows cmd
(CLI)并且编译和链接C 代码 (example.c
) 和
gcc -c example.c -I"C:\MinGW\msys.0\local\include" -Wall
gcc -static example.o -L"C:\MinGW\msys.0\local\lib" -lgsl -lgslcblas -lm
或具有
的C++代码(相当于example.c
)
g++ -c example.cpp -I"C:\MinGW\msys.0\local\include" -Wall
g++ -static example.o -L"C:\MinGW\msys.0\local\lib" -lgsl -lgslcblas -lm
即,在链接中使用 -static
选项,然后一切正常,最终的可执行文件运行时没有任何错误消息。所以,问题似乎与库的动态链接有关。
如有错误请指正
可执行文件不会 运行 在 windows cmd
下,因为库
您编译的 libgsl-0.dll 不在系统或用户路径上。 Windows 确实
不知道去哪里找。直接的解决办法是告诉系统
通过编辑环境变量 PATH 以包含
libgsl-0.dll 的位置。这可以通过输入
cmd
完成
PATH=PATH;path-to-libgsl-0.dll
在命令行上。 (我不记得图书馆在哪里结束了,所以 请原谅我不具体。)这只会持续 session, 但是,要使更改永久化,必须通过以下方式编辑 PATH 变量 通过控制面板。访问环境变量的一种方法 通过单击 "Advanced system settings" 可以在左侧找到 window 通过点击控制面板->系统和安全得到 ->System 或通过 right-clicking 在计算机上的开始菜单中选择 特性。单击 "Advanced system settings" 打开一个 window,其中 按钮 "Environment Variables" 出现,环境变量变为 单击该按钮即可访问。不过,要编辑 PATH,我会 建议使用可以在 here 找到的免费软件实用程序 "PathEditor.exe"。该实用程序使该过程更加容易。
不过,您的构建设置远非最佳。使用
.configure
没有任何选项的步骤意味着生成的文件将
安装在 C:\MinGW\msys.0\local 下,分布在几个
目录。如果您想安装,将很难删除文件
安装后更新版本的 GSL
还有其他
开发库。我建议添加选项 --prefix=C:/MinGW/gsl
到 .configure
步骤。 (对于一组完整的选项 运行 .configure --help
。)
这使得安装变得非常容易
如果需要,只需删除或重命名 C:\MinGW\gsl 即可。
此外,MSYS 的目的是促进有针对性的软件构建
对于 GNU 系统,这不是 Windows 方式。软件一旦构建
不应驻留在 MSYS 下,而应驻留在 C:\MinGW 下的某个位置并制作
可访问的
C:\MinGW\bin 中的构建工具,用于构建本机 Windows 程序
使用 cmd
或其他合适的 Windows 工具。实际上这意味着
如果需要 MSYS,则应始终使用 --prefix=C:/MinGW
构建要在 MinGW 中使用的软件,在本例中为 GSL 头文件和
图书馆。不过,出于给定的原因,最好选择 --prefix=C:/MinGW/software
.
安装软件后不要忘记编辑PATH,以便系统 可以找到任何需要的库。
没那么简单。 gcc 在 bash shell 中从 LINUX 命令提示符运行。 MinGW32-gcc 从 cmd.exe shell 中的 DOS 命令提示符运行。执行需要动态 link 库(DOS 中的 .dll 或 Linux 中的 .so .la)的程序所需的动态 linking 也是 OS 依赖。 Linux 动态库和 Windows 动态库不可互换。这是意料之中的事;但是,Linux' bash shell 中 gcc 和 ld 创建的静态库似乎与 Windows' cmd.exe [=27= 中的 MinGW32-gcc 不兼容] 这让我很惊讶。我无法将 MinGW32-gcc 设置为 link 至 libgsl.a;我一直从 ld 收到未解决的引用。我也不知道如何让 GSL 在 cmd.exe shell.
中构建作为参考,请注意,之前的所有答案均已过时。对于 Win64,MinGW 和 MSYS 已被独立项目 Mingw-w64 和 MSys2 取代。不再需要自己编译 GSL:使用来自 https://packages.msys2.org/package/mingw-w64-x86_64-gsl.
的二进制文件