我无法将我的程序与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
你知道如何进一步调查吗?链接器正确地找到了该库(否则它会报错),并且该库包含缺失的符号。那么会出什么问题呢?谢谢!
发布于 2018-06-01 20:10:43
显然,我把链接器标志的顺序安排错了。动态库标志必须出现在目标文件之后。以下链接命令有效:gcc -o exe t.c -lgsl -lgslcblas -lm
更多信息:Why does the order in which libraries are linked sometimes cause errors in GCC?
https://stackoverflow.com/questions/50626869
复制相似问题