c++ - 编译时如何处理 C++ 解决方案源文件?

标签 c++ compilation linker extern resource-files

这是主题代码:

外部文件.cpp

int i = 10;

主文件.cpp

#include <iostream>

using namespace std;

extern int i;
int main(int param)
{
    cout << i << '\n';
    int i = 0;
    cout << i << '\n';
    cout << ::i << '\n';
}

当编译这个程序(使用 Visual Studio 2008)时,它工作正常,输出将是:

10
0
10

这对我来说并不奇怪,这是一个范围问题。

但让我感到困惑的是:mainfile.cpp 文件如何从另一个 .cpp 文件中获取 i 的值(externfile.cpp 在我们的例子中)?仅仅是因为它们位于同一目录中吗?还是相同的解决方案?

更好的方法是:在编译项目时如何“合并”源文件(使用 VS2008,如果我应该指定的话)?他们按什么“顺序”放置?它们的范围如何?

最佳答案

一个“正常”的 VC++ 项目1 指示 VC++ 将每个源文件自己编译成一个“目标文件”(或目标模块),其中编译器为不存在的符号留下“占位符”尚未解决(如声明但未定义的 external 变量或函数)。

然后,链接器将所有目标文件捆绑在一起,将它们捆绑在一起以生成最终的可执行文件。在此段落中,“占位符”被替换为它们引用的代码/数据的实际地址,这些代码/数据在各种目标文件中定义。如果未找到某些需要的定义,则会出现 undefined reference 错误;如果多次找到某个符号,则会出现多重定义错误2

有关经典链接模型的更多信息,请查看 this article作者:Raymond Chen(如果您有兴趣,请转到 whole series)。


  1. 当然还有更多的灵 active 空间,这里我只是描述 VC++ 中的常见情况。
  2. 这是C++“单一定义规则”的结果;尽管如此,还是有一些异常(exception),特别是 inline 函数和 template 实例化;在这些情况下,链接器只接受它喜欢的任何内容(这应该不是问题,因为此类对象的多个定义必须相同)。

关于c++ - 编译时如何处理 C++ 解决方案源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14420611/

相关文章:

c++ - 如何测试 C++ 的功能支持?

c++ - 如何使用 CGAL 存储折叠的边缘

java - 无与伦比的类型 : int and Number in java 8

c - 这些链接器的行为是什么?

c - 如果链接描述文件中未定义部分,则虚拟内存地址错误

c - 在链接器文件STM32中添加一个RAM段

c++ - 如何在不同类型的值之间进行选择以传递给多态函数?

java - Swig:将返回类型 std::string 转换为 java byte[]

java - 动态编译语言 vs 静态编译语言

aix6.1 上的 python3.2 错误