c++ - 海湾合作委员会建立。预期错误

标签 c++ gcc

我不是任何语言或 GCC 方面的专家。所以我的问题可能不合标准。

我正在使用 GCC 构建包含数千个 CPP 文件的代码库。在文件中说 A.cpp 我正在调用 B.cpp 中的一些函数 [B.cpp 包含定义类的类方法定义 B.h].构建还可以。但是后来我从 makefile 中排除了 B.o。所以现在目标文件 B.o 没有被创建。但在这种情况下,我预计会在编译或链接阶段出现错误,因为 A.cpp 引用了 B.cpp 中的函数。但是没有,代码仍然没有错误地构建。但是当我将 fn 调用从 A.cpp 移动到另一个文件 C.cpp 时,它给了我一个链接器错误,我认为这是预期的行为。

这是预期的行为吗?我还检查了在构建期间创建的映射文件,其中列出了所有函数名称,并且 B.cpp 中的函数存在于映射中,即使未创建 B.cpp 的目标文件。所以我的问题是为什么当我从不属于构建的文件中调用函数时没有错误。我尝试从以前的构建中删除所有目标文件和二进制文件以清除可能存在的任何残留物,但无济于事。我没有任何线索。谁能提供一些帮助?

在我的 map 文件中,正常的功能是这样列出的

80010820 T __gccmain

80010828 t __gccmain_end

但是来自 B.cpp 的 fns 被列为

U CNvThread::ProcMsgReq(unsigned, void*)

U CNvDbMgrThread::Singleton(unsigned long)

最佳答案

如果 B.o 仍然存在于之前的构建中,它将很好地链接到旧拷贝(除非发生重大变化)。如果您没有构建最终的可执行文件,而只构建了 A.o,那仍然没有问题,因为 A.o 引用了 B 中的函数,但不是' 与它们链接,直到最终输出文件链接。

同样,如果 B.o 在之前的构建中仍然存在,它将被使用,这就是它出现在 map 文件中的原因。

关于c++ - 海湾合作委员会建立。预期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14228011/

相关文章:

c++ - gtkmm 链接器错误

gcc - 即使将 --prefix 传递给 configure 也拒绝安装权限

c - 优化禁止插入地址大小覆盖前缀

C++ 错误, undefined reference 类

c++ - 复杂类的值类型,或类本身

c++ - 如何为算术表达式创建 BST

c++ - 使用 OpenSSL 解密 DES

c - 打印多个字符,格式为整数

linux - 如何在GCC 4.6.3版本中强制内联函数?

c++ - C++ 中 (x) 的类型