我尝试在一个项目中使用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包)。
/ 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
[...]
答案 0 :(得分:8)
轻松修复:
您必须如下链接
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:见图片
答案 1 :(得分: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$
答案 2 :(得分:0)
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&#34;是GSL中包含目录的位置和&#34; C:\ Program Files \ GnuWin32 \ lib&#34;是lib目录的位置。