程序链接GSL遇undefined reference错误,库含对应符号求排查方案
解决GSL链接时
undefined reference to 'gsl_ran_pareto'的问题 这是一个典型的链接器参数顺序错误导致的问题,我来一步步帮你排查和解决:
最可能的原因:库参数放在了目标文件前面
GCC的链接器(ld)是按照从左到右的顺序处理输入文件的:
- 当它先处理
-lgsl等库参数时,此时还没有看到t.o里的未定义符号gsl_ran_pareto,所以不会把库中对应的符号纳入最终的可执行文件。 - 等到处理
t.o时,发现了未定义符号,但后面已经没有库可以用来解析这个符号了,于是报错。
解决方法:调整编译命令的顺序
把目标文件t.o放在所有库参数的前面:
gcc t.o -lgsl -lgslcblas -lm -o exe
或者直接一步完成编译加链接:
gcc t.c -lgsl -lgslcblas -lm -o exe
其他排查方向(如果上面的方法无效)
如果调整顺序后还是报错,可以检查以下几点:
- 确认GSL版本是否支持该函数:运行
gsl-config --version查看版本,gsl_ran_pareto是在GSL 1.15及以后版本加入的,Ubuntu 16.04的默认GSL版本是2.1,应该没问题,但可以验证一下头文件里的声明:
正常应该能看到函数声明。grep gsl_ran_pareto /usr/include/gsl/gsl_randist.h - 检查是否有64位/32位架构不匹配:如果你的程序是32位的,但安装的是64位GSL库,也会出现这种问题。可以用
file t.o查看目标文件的架构,再用file /usr/lib/x86_64-linux-gnu/libgsl.so对比是否一致。 - 确认静态库的链接顺序:如果用静态库,同样要把目标文件放在前面,比如:
gcc t.o -static -lgsl -lgslcblas -lm -o exe
从你提供的信息来看,符号确实存在、目标文件也正确引用了该符号,所以调整链接顺序应该就能解决问题了。
内容的提问来源于stack exchange,提问作者Nachshon Cohen
相关产品推荐
相关产品推荐

