C ++链接器如何知道要使用的.cpp文件

时间:2016-10-17 21:32:44

标签: c++ compilation linker

我是一名C ++学习者,我遇到了将代码分成多个文件的概念,以加快大型项目的编译过程。

然而,这本书没有告诉我,我试图在其他书籍和网络上找到它,但没有运气,链接器(在编译期间)如何知道要包含哪些文件。

当我创建新文件时,我使用#include "newfile.h"将其标题连接到主文件,但是在此标题中,我没有写到查找函数定义的位置。

所以我怎么想象这个过程是它从主文件开始,并在那里找到与其他文件的“连接”。问题是它如何找到那些我认为不需要与其头文件命名相同的.cpp文件。

Exmple:

主档案:

#include <iostream>
#include "krneki_H.h"

using namespace std;


int main()
{
 krneki1();
 krneki2();
 krneki3();
}

和标题文件:

void krneki1();
void krneki2();
void krneki3();

新的.cpp文件:

#include <iostream>
#include "krneki_H.h"

using namespace std;

void krneki1() {
cout<<"Krneki1"<<endl;}

void krneki2() {
cout<<"Krneki2"<<endl;}

void krneki3() {
cout<<"Krneki3"<<endl;}

请注意,没有迹象表明使用第二个cpp文件。它只知道使用它。它是否会搜索地图中的所有.cpp文件?

感谢您的回答。

2 个答案:

答案 0 :(得分:7)

使用.cpp或类似命令行编译两个gcc -c文件,然后将生成的.o个文件传递给链接器。链接器并没有神奇地知道您要编译另一个.cpp文件。

例如

gcc -c main.cpp -o main.o           # compile
gcc -c krneki_H.cpp -o krneki_H.o   # compile
gcc main.o krneki_H.o -o main       # link

您的IDE可能会自动处理这些详细信息,在这种情况下,它会编译您添加到项目中的所有.cpp个文件,然后链接编译步骤生成的所有.o个文件。

答案 1 :(得分:0)

没有。它并不只是知道使用它。在您的示例中,如果使用main.cpp进行编译并且没有新的cpp文件,那么您将获得一个未定义的引用&#34;错误。

您所使用的是一个自动编译所有cpp文件的花哨IDE会发生什么。它默认包含在makefile中。

我建议你尝试从头开始设计一个makefile,亲自看看你将如何得到这个&#34;未定义的引用&#34;如果您不包含具有函数实现的cpp文件,则会出错。