编译问题小结

遇到undefine reference问题

问题:我遇到的这个问题的起因是由于,在Makefile中链接处静态链接库顺序放置不正确导致的。
因为链接库之间也可能有引用关系,g++链接时是从后往前寻找外部符号,所以说越底层的库应该放在越后面。
例如

g++ …… -o ./bin/exe  *.o -la -lb

如果b对a有引用,则会发生undefine reference错误。
这时应该调整为

g++ …… -o ./bin/exe  *.o -lb -la

当遇到不清楚各个库之间的引用关系是怎么办?

遇到这种情况可以根据报错信息,和nm命令确定库中的函数的关系。
例如报错

(.text+0x13): undefined reference to `func'

我们如果有多个.a文件,不知道究竟是哪些库导致的问题,这是可以利用linux命令 nm

nm -A ../../*.a |grep func

-A代表库文件名与函数所在行一起输出,方便确认输出究竟属于那个库文件。
从信息中得到函数的引用关系,再调整顺序。


Makefile写错导致的undefined reference

由于在Makefile中经常定义很多变量,看起来会有些复杂,导致有可能在Makefile中没有发现错误。但是实际编译的时候错误就显现了。
其实在执行make的时候会输出替换好的命令,这时可以其中输出的信息,查看命令是否与自己设想的相同判断是否Makefile编写错误。

你可能感兴趣的:(编译问题小结)