我试图在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标志)上编译良好。
答案 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
搜索路径时会生成这样的引用...即故意污染头池。