编译源码的过程及现象:
单独编译每个 .c 文件生成 .o 目标文件都没有出错,
将所有的目标文件链接生成可执行文件时候却提示其中的一个函数undefined reference to ;
然后检查代码,clion的跳转功能 能定位到头文件,也能在util.c中找到函数的实现,
尝试解决的过程:
自然是百度了,
原因一:一般都是确实未定义,这个可以排除因为都能跳转到代码实现(后面被自己打脸);
原因二:然后一个可能的 原因是链接时目标文件的摆放顺序问题,比如 1.c中实现的函数a(),
2.c中调用a(), 但是链接时2.o 排在了1.o的前面,链接器找不到函数的实现,因而报错。
原因三:然后大部分的教程都是使用第三方库的时候报该错误的处理方案,觉得参考意义不大。
柳暗花明:
停滞了两天之后,换个思路,想着能否知道链接错误更详细的信息,了解到nm命令,使用
nm 对 util.o 进行分析,确实没有在符号表中找到想调用的函数。遂去查代码,往上翻发现被前人用
#if 0
代码实现
#endif
在预编译阶段注释掉了。终于不再怀疑自己的基本认知了。
照例感想:
在这里面受到了困扰总体还是自己不自信,正是因为对自己的基础不自信,查询到该错误出现的原因就那几种。没有方向就会乱试。
得出的结论:代码没有玄学,无法理解要么缺乏基础,要么分析的不够细致。