c++ - 如何找到在静态库中定义符号的位置

标签 c++ linker libraries undefined-symbol

假设您使用包含多个工具和库的代码库,并且您想要移植(或复活)此类代码库中的某些组件,但是关于符号在各种库中的位置的任何线索要么丢失,要么需要很长时间才能找到查看代码本身(是的,改进的文档可以避免此类问题,但要求很高)。发现在哪个库中可以找到代码中使用的符号的最快方法是什么?

最佳答案

假设是一个 linux 机器,nm 工具会在库文件中列出名称,来拯救。

它可以用来进行广泛的搜索,如下所示:首先可以使用 find 找到所有可用的库(假设项目已经成功编译,没有您要添加的组件),然后可以将这样的 find 包含在一个在所有发现的库上调用 nm 的循环;然后 grep 输出以丢弃“U”引用( undefined symbol ,也就是在其他地方使用该符号)。在一个 bash 行中给出:

for lib in $(find base_path -name \*.a) ; do echo $lib ; nm $lib | grep my_symbol | grep -v " U "   ; done

哪里:

  • base_path 是你的代码库的根
  • my_symbol 是您要查找的符号

echo 生成了所有找到的库的列表,这不是很干净,因为它输出的库名称不包含符号,但这是我发现直接引用库的最快方式,所以当你看到:

base_path/component/libA.a
0000000000000080 D my_symbol

你找到了你通常的嫌疑人。

关于c++ - 如何找到在静态库中定义符号的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19916119/

相关文章:

c++ - 如何在 "first-chance"期间使用 VS 调试器检查 C++ 异常对象?

c++ - 计算数组长度

python - 在 Windows 中构建 Python C 扩展时导出符号时出错

c++ - 在 C++ 中为其他语言创建库

c++ - 相同的地址,多个 shared_ptr 计数器,C++ 标准是否禁止?

c++ - Hook 创建窗口并想要获取类名

winapi - bcc32 - 没有控制台子系统,也没有 Windows 子系统

linux - 在构建依赖共享库的程序后如何更改共享库的文件名?

c# - 在未安装 SQL 的客户端计算机上使用 SQL 库

java - 外部库如何工作