我无法将我的程序与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
找到此符号。
我也尝试将库复制到本地文件夹并直接链接 - 仍然是同样的问题。
更多信息(测试程序t.c的代码,t.o的符号列表,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
知道如何进一步调查吗?链接器正确地找到库(否则会抱怨),并且库包含缺少的符号。那么什么可能出错? 谢谢!
答案 0 :(得分:0)
显然,我以错误的顺序安排了链接器标志。动态库标志必须出现在目标文件之后。
以下链接命令有效:gcc -o exe t.c -lgsl -lgslcblas -lm
更多信息:Why does the order in which libraries are linked sometimes cause errors in GCC?