我只是想知道是否有一种有效的技术来解决 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/