我在工作中遇到了几个“未定义的引用”(在链接期间)和“未解析的符号”(在 dlopen 之后的运行时期间)问题。这是一个相当大的 makefile 系统。
是否有链接库和使用编译器标志/选项来避免这些类型的错误的通用规则和指南?
如果您使用的是 MSVC :
您无法通过设置标志来避免此类错误:这意味着某些单元(.cpp)没有声明的标识符的定义。这肯定是由于某处缺少包含或缺少对象定义(通常是静态对象)引起的。
在开发过程中,您可以遵循这些准则(来自那些文章)以确保您的所有 cpp 包含它们需要的所有标头,但仅此而已:
- 每个 cpp 文件首先包含自己的头文件。这是最
重要指导方针;其他一切
从这里开始。唯一的例外
这条规则是预编译头
包含在 Visual Studio 中;那些
总是必须是第一个包含在
文件。有关预编译的更多信息
本文第二部分的标题。
- 头文件必须包含解析它所需的所有头文件。
这与第一个齐头并进
指导方针。我知道有些人试图
永远不要在其中包含头文件
声称效率的头文件或
沿着这些思路的东西。然而,
如果文件必须包含在
头文件可以被解析,它必须
被包含在某个地方。优势
直接将其包含在标题中
文件是我们总是可以决定
拉入我们感兴趣的头文件
我们保证它会
按原样工作。我们不必玩
“猜猜你还需要什么其他标题”
游戏。
- 头文件应该具有最少数量的头文件
需要解析它。以前的
规则说你应该拥有所有
包含您需要的头文件。
这条规则规定你不应该有任何
比你必须做的更多。明确,开始
通过删除(或不添加
第一名)无用的包括
声明。然后,使用尽可能多的转发
尽可能声明而不是
包括。如果你拥有的只是
指向类的引用或指针,您
不需要包含该类'
头文件;前向参考将
做得更好,更有效率。
但正如评论者所建议的,您似乎正在使用 g++...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)