c++链接器如何知道要使用什么.cpp文件?
How does C++ linker know what .cpp files to use
我是一个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文件?
谢谢你的回答
您使用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
文件。
No。它不仅知道如何使用它。在您的示例中,如果您使用main.cpp
编译而没有这个新的cpp文件,您将得到一个"未定义的引用"错误。
实际情况是,您正在使用一个自动编译所有cpp文件的高级IDE。默认情况下,它会在你的makefile中包含它们。
我建议您尝试从头开始设计一个makefile,并亲自查看如果您不包含包含函数实现的cpp文件,您将如何获得"未定义引用"错误。
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 什么是(或如何制作)cpp中矢量的默认初始值设定项?
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- cpp中rand()方法的bankend程序是什么?
- 包含 .h 文件和 c/cpp 文件有什么区别?
- Cpp 什么是字符 a 的声明 [10][100]
- cpp 中的以下链表程序有什么问题?
- 如果我在库中和应用程序中编译了相同的CPP文件,会发生什么
- cpp 中"[=]"的含义是什么
- $(objs):%.o:%.cpp和$(objs):$(objs:.o = .cpp)之间的差异是什么
- 线程上的"detach()"有什么作用?.CPP
- 生成代码以与不需要重新编译的正在运行的 cpp 应用程序交互的好方法是什么?
- 关于实施其中之一的CPP,这三个规则究竟是什么?
- 在什么条件下,数据库在从 cpp 执行选择查询时不会关闭游标
- Dynamic_cast何时返回0,什么时候引发异常?CPP
- CBP文件和CPP文件之间有什么区别
- pImpl习语-将私有类实现放在cpp中有什么缺点
- c++链接器如何知道要使用什么.cpp文件?
- 什么.cpp把代码在qt的形式