9

我尝试在一个项目中使用 gsl 库,但我无法从 gsl 网站上获取示例程序正常运行。源代码和所有命令取自网站:https ://www.gnu.org/software/gsl/manual/html_node/Using-the-library.html#Using-the-library

该程序如下(test.cpp):

#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>

int main (void) {
  double x = 5.0;
  double y = gsl_sf_bessel_J0 (x);
  printf ("J0(%g) = %.18e\n", x, y); 
  return 0;
}

然后我首先编译没有错误。但链接失败:

$ g++ -Wall -I/usr/include/ -c test.cpp
$ g++ -L/usr/lib/ -lgsl -lgslcblas -lm test.o
test.o: In function `main':
test.cpp:(.text+0x1c): undefined reference to `gsl_sf_bessel_J0'
collect2: ld returned 1 exit status

但是库是可用的:

$ ll /usr/lib/libgsl*
lrwxrwxrwx 1 root root   16 Mar  2  2012 /usr/lib/libgsl.so.0 -> libgsl.so.0.16.0
lrwxrwxrwx 1 root root   16 Mar  2  2012 /usr/lib/libgsl.so -> libgsl.so.0.16.0
lrwxrwxrwx 1 root root   20 Mar  2  2012 /usr/lib/libgslcblas.so.0 -> libgslcblas.so.0.0.0
lrwxrwxrwx 1 root root   20 Mar  2  2012 /usr/lib/libgslcblas.so -> libgslcblas.so.0.0.0
-rw-r--r-- 1 root root 2.3M Mar  2  2012 /usr/lib/libgsl.so.0.16.0
-rw-r--r-- 1 root root 274K Mar  2  2012 /usr/lib/libgslcblas.so.0.0.0
-rw-r--r-- 1 root root 503K Mar  2  2012 /usr/lib/libgslcblas.a
-rw-r--r-- 1 root root 4.3M Mar  2  2012 /usr/lib/libgsl.a

以及头文件:

$ whereis gsl
gsl: /usr/include/gsl /usr/share/man/man3/gsl.3.gz

我也尝试手动下载和安装 lib,但没有区别(这个是 12.04 LTS 的 Ubuntu 包)。

/编辑2:

使用 nm 它不会给出任何进一步的提示:

$ nm /usr/lib/libgsl.a
[...]
bessel_J0.o:
00000000000004c0 T gsl_sf_bessel_J0
0000000000000000 T gsl_sf_bessel_J0_e
                 U gsl_sf_bessel_cos_pi4_e
[...]
4

3 回答 3

12

轻松修复:

您必须链接如下

 g++ -L/usr/local/lib/ test.o -lgsl -lgslcblas -lm

您在链接时颠倒了顺序(首先是 .o 文件,然后是 -l 标志)

PS:我可以使用您的原件重现您的问题

 g++ -L/usr/local/lib/ -lgsl -lgslcblas -lm test.o 

而且我一直使用 gsl 没有链接问题。正如我之前所说,我通过颠倒顺序来修复。

PS2:在此处输入图像描述见图片

于 2013-09-03T20:48:19.453 回答
3

这在 Ubuntu 13.04 上运行顺利:

edd@max:~/src/progs/C$ cat gsl_bessel.c
// cf http://stackoverflow.com/questions/18588607/g-unable-to-link-libgsl

#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>

int main (void) {
    double x = 5.0;
    double y = gsl_sf_bessel_J0 (x);
    printf ("J0(%g) = %.18e\n", x, y); 
    return 0;
}
edd@max:~/src/progs/C$ gcc -Wall -o gsl_bessel gsl_bessel.c -lgsl -lgslcblas -lm
edd@max:~/src/progs/C$ ./gsl_bessel 
J0(5) = -1.775967713143382642e-01
edd@max:~/src/progs/C$ 

也许重新安装/检查软件包?他们已经很久没有改变了。

(免责声明:我恰好是这些软件包背后的 Debian 维护者。)

编辑:哦,重新阅读你的标题和标签,你的错误是使用g++代替gcc. 这是一个 C 库,您编写了一个 C 程序。它适用于 C++,但您需要extern "C"(这是一个不同的主题)。

编辑2:没关系。在这里也可以正常工作,g++因为标头已准备好 C++:

edd@max:~/src/progs/C$ rm ./gsl_bessel
edd@max:~/src/progs/C$ g++ -Wall -o gsl_bessel gsl_bessel.c -lgsl -lgslcblas -lm
edd@max:~/src/progs/C$ ./gsl_bessel 
J0(5) = -1.775967713143382642e-01
edd@max:~/src/progs/C$ 
于 2013-09-03T13:21:02.710 回答
1

Windows 上的 GSL 链接:

gcc -c test.c -Wall -I"C:\Program Files\GnuWin32\include"  -o test.o -L"C:\Program Files\GnuWin32\lib" -lgslcblas -lgsl -lm

gcc -o test.exe test.o -L"C:\Program Files\GnuWin32\lib" -lgslcblas -lgsl -lm

其中 C:\Program Files\GnuWin32\include" 是 GSL 中包含目录的位置,"C:\Program Files\GnuWin32\lib" 是 lib 目录的位置。

于 2016-02-02T17:20:43.347 回答