C++;链接器知道要使用什么.cpp文件 >我是C++学习者,我遇到了一个将代码分成多个文件的概念,以加快大型项目的编译过程。>P/>

C++;链接器知道要使用什么.cpp文件 >我是C++学习者,我遇到了一个将代码分成多个文件的概念,以加快大型项目的编译过程。>P/>,c++,compilation,linker,C++,Compilation,Linker,然而,这本书没有告诉我的是,我曾试图在其他书籍和网络上找到它,但运气不佳的是链接器(在编译期间)如何知道要包含哪些文件 当我创建新文件时,我用#include“newfile.h”将其头文件连接到主文件,但是在这个头文件中,我不写在哪里可以找到函数的定义 因此,我认为这个过程是从主文件开始的,在主文件中找到与其他文件的“连接”。问题是它如何找到那些在我看来不需要与头文件命名相同的.cpp文件 示例: void krneki1(); void krneki2(); void krneki3();

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

当我创建新文件时,我用
#include“newfile.h”
将其头文件连接到主文件,但是在这个头文件中,我不写在哪里可以找到函数的定义

因此,我认为这个过程是从主文件开始的,在主文件中找到与其他文件的“连接”。问题是它如何找到那些在我看来不需要与头文件命名相同的.cpp文件

示例:

void krneki1();
void krneki2();
void krneki3();
#include <iostream>
#include "krneki_H.h"

using namespace std;

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

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

void krneki3() {
cout<<"Krneki3"<<endl;}
主文件:

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

using namespace std;


int main()
{
 krneki1();
 krneki2();
 krneki3();
}
和新的.cpp文件:

void krneki1();
void krneki2();
void krneki3();
#include <iostream>
#include "krneki_H.h"

using namespace std;

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

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

void krneki3() {
cout<<"Krneki3"<<endl;}
#包括
#包括“krneki_H.H”
使用名称空间std;
void krneki1(){

coutNo。它不仅仅知道如何使用它。在您的示例中,如果使用
main.cpp
编译,并且没有新的cpp文件,您将得到一个“未定义引用”错误

发生的情况是,您正在使用一个奇特的IDE自动编译所有cpp文件。默认情况下,它将所有cpp文件都包含在您的makefile中

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

您使用
gcc-c
或类似命令行编译两个
.cpp
文件,然后将生成的
.o
文件传递给链接器。链接器不会神奇地发现您想要编译另一个
.cppde>文件

比如说

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
文件。

不要垃圾邮件标记!C是另一种语言!它什么都不知道。您可以告诉它链接哪些文件。链接器不使用源代码。程序员必须告诉链接器它需要哪些文件,但它们是编译过的二进制文件,而不是
.cpp
.h
文件。我自己也很想知道。据我所知,指定目录中的.cpp文件都是编译的(编译单元).include
指令包含标题中的文件,就好像您在该行中键入文件一样。最后,链接器链接函数调用并查找
main
以将其作为第一条指令。