[英]How are c++ solution source files dealt while being compiled?
这是主题代码:
externfile.cpp
int i = 10;
mainfile.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
变量或函数,声明但未定义)。
然后,链接器将所有目标文件绑定在一起,将它们连接在一起以生成最终的可执行文件。 在此过程中,“占位符”将替换为各种目标文件中定义的代码/数据的实际地址。 如果找不到某些需要的定义,则会得到未定义的引用错误,如果多次找到某个符号,则会出现多重定义错误2 。
有关链接的经典模型的更多信息,请查看Raymond Chen 撰写的这篇文章 (如果您有兴趣,请参阅整个系列 )。
inline
函数和template
实例化; 在这些情况下,链接器只需要它喜欢的任何东西(这应该不是问题,因为这些对象的多个定义必须相同)。 您的IDE VS2008将源文件传递给编译器。 编译器将源文件构建到目标文件,然后将这些文件传递给链接器,链接器链接这些文件以及包含。
然后,链接器将吐出所有这些文件的二进制表示,无论是dll,lib还是exe。
这是对发生的事情的一个非常基本的总结,还有更多的过程。
如果您手动执行此操作,则运行C或C ++程序将有4个步骤
1 - 预处理,主要处理C宏,#define等。
2 - 编译时,文件将转换为带有外部符号表的目标代码,以便稍后解决
3 - 链接,解析外部引用,如果无法找到它们,则报告任何错误
4 - 运行代码。
所有这些都由IDE VS2008自动完成。 它会根据需要执行这些步骤,如果文件未更改,则不会重新编译,如果不需要链接,则不会执行此操作。 在.Net中,需要更多步骤来制作组件等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.