GSL的GCC / MinGW问题

时间:2015-07-08 02:20:39

标签: 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从源代码编译GSL(以及使用MinGW路径配置前缀),但在我看来,链接到GSL库不是问题 - 即函数似乎位于正确。

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

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

我在PATH中放置了相应的目录。

我对这个意想不到的错误感到非常困惑,因为它似乎链接到GSL会弄乱基本C库的链接?此外,该程序在Ubuntu 15.04(使用GSL标志)上编译良好。

1 个答案:

答案 0 :(得分:0)

,或__infinity,在GSL的 clean MinGW版本中。为了记录,我刚刚下载了_imp____infinity,解压缩并做了,(使用Linux托管的gcc-4.8.2 mingw32-cross-compiler):

_impure_ptr

这会在gsl-latest.tar.gz中创建以下内容:

$ 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上执行了STFW,但未找到任何MSDN参考;最有用的命中是cygwin ML线程,这表明当用户在构建时不正确地将cygwin的头路径添加到MinGW编译器的$ nm -A staged/lib/*.a | grep infinity $ nm -A staged/lib/*.a | grep impure_ptr 搜索路径时会生成这样的引用...即故意污染头池。