g ++无法链接libgsl

Oli*_*ver 9 c++ linker gsl

我尝试在一个项目中使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

但图书馆可用:

$ 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
Run Code Online (Sandbox Code Playgroud)

以及头文件:

$ whereis gsl
gsl: /usr/include/gsl /usr/share/man/man3/gsl.3.gz
Run Code Online (Sandbox Code Playgroud)

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

/ EDIT2:

使用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
[...]
Run Code Online (Sandbox Code Playgroud)

Viv*_*nda 9

轻松修复:

您必须如下链接

 g++ -L/usr/local/lib/ test.o -lgsl -lgslcblas -lm
Run Code Online (Sandbox Code Playgroud)

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

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

 g++ -L/usr/local/lib/ -lgsl -lgslcblas -lm test.o 
Run Code Online (Sandbox Code Playgroud)

我一直使用gsl而没有链接问题.如前所述,我通过颠倒顺序来修复.

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