我只是想知道是否有一种有效的技术来解决gcc中未定义的符号问题。有时我的一个项目无法链接,我通常会花费大量时间来查找原因。通常这是一个深藏在makefile中的错字,错误的环境变量或类似的东西。如果你的构建突然与“未定义的符号”一起死亡,你使用了什么方法,这是不明显的原因?未定义符号的一般故障排除技术 - gcc
10
A
回答
23
说这是我开始的配置:
/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在那里时,我会继续构建放置该文件的库或可执行文件。
相关问题
- 1. GCC未定义符号
- 2. 排除故障system.io.fileloadexception
- 3. IPC故障排除
- 4. Shadowbox故障排除
- 5. 故障排除WPF
- 6. 故障排除“TemplateDoesNotExist在/帐号/登录/”
- 7. 编写自定义过滤器的一些故障排除
- 8. gcc:允许未定义的符号
- 9. MouseListener的故障排除
- 10. 的sitemesh排除故障
- 11. 不是一个真正的技术故障
- 12. 排除反向字符串故障
- 13. 用于排除意外的mysql查询故障的技巧
- 14. PhpStorm:导航到类文件或符号故障排除
- 15. 故障排除LI元件
- 16. Linux - 故障排除网页
- 17. 故障排除ORA-00942
- 18. 故障排除CSS background-image
- 19. 故障排除.HTM文件
- 20. 故障排除PG功能
- 21. Drupal慢速故障排除
- 22. XPath和PHP故障排除
- 23. 国际化故障排除
- 24. 故障排除CSS布局
- 25. Hello World MVC6故障排除
- 26. 故障排除从schema.yml中
- 27. autohotkey“发送”故障排除
- 28. 故障排除DataNucleus将JDO
- 29. 非root linux故障排除
- 30. css浮动故障排除
我在词典中查找单词“符号”......(对不起,它已经晚了......) – dappawit 2011-03-11 06:57:30