我在Microsoft Windows(64位)上安装了MinGW和MSYS,位于目录C:\MinGW
内(MSYS目录为C:\MinGW\msys\1.0
)。我从official ftp下载了最新的GNU Scientific Library( GNU GSL )包。
我已使用MSYS成功执行configure
和make
,如GSL包中的INSTALL
文件所述。这意味着,在MSYS命令行界面的MSYS home
目录中,我插入了:
$ ./configure
$ make
$ make install
这将在MSYS目录(local
)下生成一个C:\MinGW\msys\1.0
目录,其中包括目录bin
,include
,lib
和share
我已根据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。尝试重新安装该程序以解决此问题。
我想知道遗失了什么?应该怎么做才能生成可执行文件?
答案 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), 必须注意在您的发行版中正确满足运行时依赖性。要实现这一目标,您必须选择:
%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中的二进制文件。