GCC/MinGW GSL 问题
GCC/MinGW problems with 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 池。
我正尝试在 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 池。