c - GSL 的 GCC/MinGW 问题

标签 c windows gcc mingw gsl

我正在尝试在 Windows 7 上使用 MinGW 编译一个 C 程序。该程序依赖于 GSL 的 CBLAS 库,所以简而言之,我(试图)在终端 (cmd) 中运行此命令:

gcc MyProgram.c -o MyProgram.exe -O3 -lm -lgsl -lgslcblas

这会导致一长串错误消息,格式如下:

undefined reference to '_imp____infinity'

undefined reference to '_impure_ptr'

来自各种 GSL 函数。即:

/gsl-1.9/specfunc/trig.c:335: undefined reference to '_imp____infinity'

这似乎与GSL中的OVERFLOW_ERROR函数有关。

我使用 MSYS(并使用 MinGW 的路径作为前缀配置)从源代码编译 GSL,但在我看来,与 GSL 库的链接不是问题 - 即函数似乎位于正确的位置。

作为记录,我可以删除程序的基于 CBLAS 的部分(使程序有些无用)并使用以下方法成功编译程序:

gcc MyProgram.c -o MyProgram.exe -O3 -lm

我在 PATH 中放置了适当目录的位置。

我对这个意外错误感到很困惑,因为似乎链接到 GSL 弄乱了到基本 C 库的链接?此外,该程序在 Ubuntu 15.04(带有 GSL 标志)上编译良好。

最佳答案

绝对不应该引用__infinity,(这将转化为的DLL导入引用_imp____infinity),或 _impure_ptr,在 GSL 的 clean MinGW 构建中。作为记录,我刚刚下载了 gsl-latest.tar.gz,解压并执行了(使用 Linux 托管的 gcc-4.8.2 mingw32-cross-compiler):

$ mkdir gsl-1.16/build
$ cd gsl-1.16/build
$ ../configure --build=x86_64-linux-gnu --host=mingw32 --prefix=/mingw
...
$ make
$ make prefix=`pwd`/staged install

这会在 staged/lib 中创建以下内容:

$ ls -R staged/lib
staged/lib:
libgsl.a      libgslcblas.a  libgslcblas.dll.a  libgslcblas.la
libgsl.dll.a  libgsl.la      pkgconfig

staged/lib/pkgconfig:
gsl.pc

然后在生成的库上运行 nm,确认不存在此类引用:

$ nm -A staged/lib/*.a | grep infinity
$ nm -A staged/lib/*.a | grep impure_ptr

我还在 undefined reference to _impure_ptr 上执行了 STFW,但未能找到任何 MSDN 引用;最有用的命中是 cygwin ML 线程,这表明当用户在构建时不正确地将 cygwin 的 header 路径添加到 MinGW 编译器的 -I 搜索路径时会生成此类引用...即故意污染 header 池。

关于c - GSL 的 GCC/MinGW 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31282459/

相关文章:

c# - 调试时在 Visual Studio 中的 C# 应用程序和 C 控制台应用程序之间传递数据

C 多子进程读写

c - 实现 strcpy : what if the destination is shorter than the source?

windows - 通过 powershell v3.0 启用 ssl 连接 filezilla

c++ - Windows C++过滤声音输出

windows - 将 Windows 应用程序作为服务运行?

没有特定长度的C结构数组成员

c - 重定向 I/O,在 C 中实现 shell

c - 定义常量变量在闪存中的位置

c++ - 我们需要原子地增加线程局部变量吗?