g++ не удалось связать libgsl

Я пытаюсь использовать библиотеку gsl в одном проекте, но я не могу заставить программу примера с веб-сайта gsl работать должным образом. Исходный код и все команды взяты с веб-сайта: https://www.gnu.org/software/gsl/manual/html_node/Using-the-library.html#Using-the-library

программа следующая (тест.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) = %.18en", 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 вручную, но нет никакой разницы (это пакет Ubuntu для 12.04 LTS).

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

3 ответов


легко исправить:

вы должны связать следующим образом

 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:enter image description hereпосмотреть картинку


это работает без заминки на 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 за этими пакетами.)

Edit: о, перечитывая ваш заголовок и теги, ваша ошибка заключается в использовании g++ вместо gcc. Это библиотека Си, и вы написали программу на Си. Он работает с C++, но вам нужно extern "C" (который отличается тема.)

Edit 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$ 

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 " является расположение каталога include в GSL и "C:\Program Files\GnuWin32\lib" - расположение каталога lib.