最近, 编译了一个detailpage.so库, 直接放到测试环境, 准备验证业务功能, 结果, 服务重启的时候显示: failed to open ....
1. 这个问题一看就知道原因了, 不是缺静态库, 而是缺符号了(符号未定义), 用ldd -r detailpage.so看了一下, 果然如下, 缺符号xxx
2. 于是用c++filt xxx查了一下, 查到了函数。
3. 于是查找函数在那么目录, 可以用之前说过的findcpp命令, 查到了对应的静态库libyyy.a. 到了这不有点纳闷了, 一切都有啊, 怎么异常呢? 准备去请教, 但还是想独立解决这个问题。 再细想了一下, 继续搞起。
4. 看看libyyy.a中缺符号xxx, 用nm命令看了一下, 发现xxx符号前面是U, 果然是未定义啊
5. 于是更新这个目录的代码, 重编, 就OK了, 一切搞定。
最后附上nm命令的操作结果:
nm输出字符 | 含义 |
R | Read only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbol |
N | 这是一个调试符号 |
D | 这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号 |
T | Text段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号 |
U | 未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型 |
S | 未初始化的符号,比如全局变量int s;则s的符号就是此类型 |