C++ g++;无法链接libgsl

C++ g++;无法链接libgsl,c++,linker,gsl,C++,Linker,Gsl,我尝试在一个项目中使用gsl库,但我无法从gsl网站上正确运行示例程序。源代码和所有命令均取自网站: 程序如下(test.cpp): 但图书馆是可用的: $ 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 ->

我尝试在一个项目中使用gsl库,但我无法从gsl网站上正确运行示例程序。源代码和所有命令均取自网站:

程序如下(test.cpp):

但图书馆是可用的:

$ 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
[...]

这在Ubuntu13.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$ 
简易修复:

你必须链接如下

 g++ -L/usr/local/lib/ test.o -lgsl -lgslcblas -lm
链接时颠倒了顺序(首先是.o文件,然后是-l标志)

附言:我可以用你的原稿重现你的问题

 g++ -L/usr/local/lib/ -lgsl -lgslcblas -lm test.o 
我一直在使用gsl,没有链接问题。如前所述,我通过颠倒顺序进行修复


PS2:请参见图片

GSL在Windows上的链接:

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目录的位置。

您是否跟踪了哪些文件实际提供了符号
gsl_sf_bessel_J0
?我有tgz存档中的源代码,该函数在specfunc/bessel_J0.c中定义。我怎样才能知道它编译到哪个lib*/编辑:如果我将“字符串”应用于lib文件,术语
gsl\u sf\u bessel\u J0
出现在
libgsl.a
libgsl.so
中,请使用
nm
objdump
等工具,谢谢您的提示!我现在用的是nm,但函数没有任何意义:
nm test.o
U gsl\U sf\U bessel\U J0
000000000000 T main
U printf
好的,我也尝试了
nm/usr/lib/libgsl.a
在那里它引用了文件
bessel\U J0.o
,谢谢,迪克。无论我使用
g++
还是
gcc
,都没有任何区别。我重新安装了很多次软件包,但没有任何改变。我没有访问旧的12.04 Ubuntu实例,但我也没有理由相信它在那里被破坏了。根据你提供的信息,我无法解释正在发生的其他事情。你没有GSL的第二个(本地)副本,是吗?哦,我有,但如果我收到相同的错误消息。我从他们的网站下载了最新版本(2013年7月的1.16版),并进行了
/configure--prefix=&&make&&make安装
。尝试
ldd gsl\u bessel
即在您构建的可执行文件上调用ldd,检查它所链接的库。实际上,lib文件夹中只有
libgsl.*
libgslcblas.*
。你到底指的是哪一个
ldd libgsl.so
给了我
linux-vdso.so.1=>(0x00007fff0c13c000)
libm.so.6=>/lib/x86_64-linux-gnu/libm.so.6(0x00007f4a3ac5b000)
libc.so.6=>/lib/x8664-linux-gnu/libc.so.6(0x00007f4a3a89c00)
 g++ -L/usr/local/lib/ test.o -lgsl -lgslcblas -lm
 g++ -L/usr/local/lib/ -lgsl -lgslcblas -lm test.o 
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