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文件吗?
谢谢你的答案.
您使用或类似的命令行编译这两个.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
编译步骤生成的所有文件.
不,它不只是知道如何使用它。在您的示例中,如果使用main.cpp
或不使用新的 cpp 文件进行编译,您将收到“未定义的引用”错误。
发生的情况是,您正在使用一个精美的 IDE,它会自动编译所有 cpp 文件。默认情况下,它会将它们全部包含在您的 makefile 中。
我建议您尝试从头开始设计一个 makefile,并亲自看看如果您不包含具有函数实现的 cpp 文件,您将如何得到“未定义的引用”错误。