C++链接器如何知道使用哪些.cpp文件

5

我是一名C++学习者,在学习大型项目编译优化时,了解到将代码分离为多个文件可以提高编译速度。

然而,这本书没有告诉我,我也在其他书籍和网上寻找过,但没有找到答案:链接器(在编译期间)如何知道要包含哪些文件。

当我创建一个新文件时,我使用 #include "newfile.h" 将其头文件与主文件连接起来,但是在这个头文件中,我没有写明函数定义在哪里。

所以,我的想象是它从主文件开始,并在那里找到与其他文件的“连接”。问题是,它如何找到那些似乎不需要与其头文件同名的 .cpp 文件。

示例:

主文件:

#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文件吗?
感谢您的回答。

不要滥用标签!C语言是一门不同的语言! - too honest for this site
3
它并不知道任何事情。您告诉它要链接哪些文件即可。 - tkausl
连接器根本不使用源代码。程序员必须告诉连接器它需要哪些文件,但它们是已编译的二进制文件,而不是.cpp.h文件。 - Galik
我自己也曾经想过这个问题。据我所知,你指定目录中的所有 .cpp 文件都会被编译(编译单元)。#include 指令会将头文件中的文件包含进来,就好像你在那一行键入了它们一样。最后,链接器会链接函数调用并查找 main 函数,并将其作为第一条指令放置。 - wally
2个回答

8
你需要使用类似于“gcc -c”的命令行编译两个“.cpp”文件,然后将生成的两个“.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
不,它不会自动使用它。在您的示例中,如果使用main.cpp进行编译并且没有那个新的cpp文件,则会出现“未定义的引用”错误。
发生的情况是您正在使用一个高级IDE,它会自动编译所有cpp文件。默认情况下,它们都包含在您的makefile中。
我建议您尝试从头设计一个makefile,并亲自体验一下,如果不包括实现函数的cpp文件,则会出现“未定义的引用”错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接