c++ - undefined symbol 的一般故障排除技术 - gcc

标签 c++ gcc linker methodology

我只是想知道是否有一种有效的技术来解决 gcc 中 undefined symbol 。有时我的一个项目无法链接,我通常会花很多时间寻找原因。通常它是一个深深隐藏的 makefile 中的错字,不正确的环境变量或类似的东西。如果您的构建突然因“ undefined symbol ”而死机并且原因不明显,您会使用什么方法?

最佳答案

说这是我的开始配置:

/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
bar.o: In function `baz()':
bar.cpp:(.text+0xd): undefined reference to `Foo::bar()'
collect2: ld returned 1 exit status

我首先使用 grep 查找所有 .o 和 .lib 文件中缺少的符号。

$ grep 'Foo.*bar' *.o *.lib *.so
Binary file bar.o matches
Binary file foo.o matches

然后我使用 nm 工具检查每个目标文件是否缺少或实现了符号。

$ nm foo.o
00000000 T _ZN3Foo3barEv

$ nm bar.o
00000000 T _Z3bazv
         U _ZN3Foo3barEv
         U __gxx_personality_v0

现在我知道 Foo::bar() 是在 foo.o 中实现的,并且可以将此文件链接到可执行文件中。所以下一部分是检查为什么 foo.o 没有包含在链接命令中。

有时您找不到任何实现符号。这通常是执行单元未构建或不包含符号(#ifdef,符号可见性)时的情况。在这种情况下,我搜索定义符号的 .cpp 文件,运行 make $file.o 以生成文件,然后检查文件。当 smbol 存在时,我会继续构建该文件所在的库或可执行文件。

关于c++ - undefined symbol 的一般故障排除技术 - gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5269869/

相关文章:

c - "stack smashing detected"的奇怪行为

c++ - 为什么这个简单函数的编译器输出如此不同?

c++ - 了解链接器重复符号错误的根源

c++ - 我怎么知道我正在读取的内存地址在 C++ 中是否为空?

c++ - 如何使从函数返回的数字用于定义数组中的元素数?

c++ - 为函数提供字符串或整数

c++ - 是否可以使用 gtest 或 gmock 模拟被调用函数的返回值?

c - GCC 4.4.3 中的功能特定优化

c++ - 出现多重定义错误

ios - 构建自己的 iOS 静态库 - 与其他框架链接