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

Sib*_*ger 4 c++ linker compilation

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

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

当我创建新文件时,我将其标题连接到主文件#include "newfile.h",但是在此标题中我不写在哪里可以找到函数的定义.

所以我想象的过程是它在主文件中启动并在那里找到与其他文件的"连接".问题是它如何找到那些我认为不需要与其头文件命名相同的.cpp文件.

Exmple:

主文件:

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

using namespace std;


int main()
{
 krneki1();
 krneki2();
 krneki3();
}
Run Code Online (Sandbox Code Playgroud)

和头文件:

void krneki1();
void krneki2();
void krneki3();
Run Code Online (Sandbox Code Playgroud)

和新的.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;}
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的答案.

Bri*_*ian 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
Run Code Online (Sandbox Code Playgroud)

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


The*_*ist 1

不,它不只是知道如何使用它。在您的示例中,如果使用main.cpp或不使用新的 cpp 文件进行编译,您将收到“未定义的引用”错误。

发生的情况是,您正在使用一个精美的 IDE,它会自动编译所有 cpp 文件。默认情况下,它会将它们全部包含在您的 makefile 中。

我建议您尝试从头开始设计一个 makefile,并亲自看看如果您不包含具有函数实现的 cpp 文件,您将如何得到“未定义的引用”错误。