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执行configure
并make
成功执行INSTALL
GSL包中的文件.这意味着,在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.尝试重新安装该程序以解决此问题.
我想知道遗失了什么?应该怎么做才能生成可执行文件?
当您为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),必须注意在您的发行版中将正确地满足运行时依赖性.要实现这一目标,您必须选择:
%PATH%
设置做出任何假设,这些假设可能适用于最终用户的机器,也可能不适用; 您应该简单地打包您的发行版,以便将所有交付的可执行文件及其附带的DLL安装到同一个目录中.作为参考,请注意,以前的所有答案都已过时。对于 Win64,MinGW 和 MSYS 已被独立项目 Mingw-w64 和 MSys2 取代。并且不再需要自己编译 GSL:使用https://packages.msys2.org/package/mingw-w64-x86_64-gsl中的二进制文件。