Не удалось связаться с GSL - PullRequest
0 голосов
/ 31 мая 2018

Я не могу связать свою программу с GSL.Команда компиляции: gcc -lgsl -lgslcblas -lm -o exe t.o.Сообщается об ошибке undefined reference to 'gsl_ran_pareto'

Но когда я проверяю символы libgsl, gsl_ran_pareto действительно появляется:

$nm -D /usr/lib/x86_64-linux-gnu/libgsl.so | grep gsl_ran_pareto
000000000011e980 T gsl_ran_pareto
000000000011e9d0 T gsl_ran_pareto_pdf

Я пытался связать со статической библиотекой GSL (добавление-static) и у него та же проблема: компоновщик сообщает undefined reference, но nm /usr/lib/x86_64-linux-gnu/libgsl.a находит этот символ.Я также попытался скопировать библиотеку в локальную папку и связать ее напрямую - все та же проблема.

Еще немного информации (код тестовой программы tc, список символов to, пакет libgsl-dev установлен правильно).

$cat t.c
#include <gsl/gsl_math.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_rng.h>
int main(){
    gsl_ran_pareto(NULL, 1, 1); 
    return 0; 
}

$ nm t.o 
                 U gsl_ran_pareto
0000000000000000 T main

$ dpkg -s libgsl-dev
Package: libgsl-dev
Status: install ok installed
...

ОС: Ubuntu 16.04

Есть идеи, как исследовать это дальше?Компоновщик правильно находит библиотеку (в противном случае он будет жаловаться), и библиотека содержит отсутствующий символ.Так что может пойти не так?Спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Видимо, я установил флаги компоновщика в неправильном порядке.Флаги динамической библиотеки должны появляться после объектных файлов.Работает следующая команда связывания: gcc -o exe t.c -lgsl -lgslcblas -lm

Дополнительная информация: Почему порядок, в котором связаны библиотеки, иногда вызывает ошибки в GCC?

...