1、原因
日常开发过程中,经常遇到“无法解析的外部符号,在xxx中引用”,或者"Unresolved external symbol Referenced In xxx"。通常原因是引用了外部函数,但找不到对应的函数地址。
2、排查思路
(1) 头文件包含是否正确,在引用的模块里面是否能够找到对应的头文件。
(2) 库文件是否正确,在引用的模块里面是否正确配置库目录,库文件名称是否正确
(3) 函数名称是否正确
a、首先排查被引用的库是否有相应的函数
linux 下可以使用objdump或者nm命令;windows下可以使用dumpbin或者Dependencies
比如:
输入:
$ objdump -CtT libssl.so | grep -a SSL_get_options
查找libssl.so是否导出SSL_get_options函数
输出:
0000000000040020 g F .text 000000000000000b SSL_get_options
0000000000040020 g DF .text 000000000000000b OPENSSL_1_1_0 SSL_get_options
如果输出为上面所示,表示SSL_get_options有定义;如果输出没有结果或者显示 *UND* 则说明该函数没有定义,需要查看被引用库。
objdump输出格式解析,可以参考 https://blog.csdn.net/SimpleForest/article/details/138373339#:~:text=%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E8%AF%A6%E7%BB%86%E8%A7%A3%E9%87%8A,%E7%AC%A6%E5%8F%B7%E7%9A%84%E7%9B%B8%E5%85%B3%E4%BF%A1%E6%81%AF%E3%80%82
b、函数名称是否正确
需要确保引用的名称要和库里导出的名称是完全一样的。
以上就是关于该问题的通用解决思路,可以解决95%该类问题,该问题可能有其他表现形式,但原因基本是一致的。