背景:最近在地图和项目中都在写c/c++。 虽然g++/cmake已经编译完成,但是相关内容有点模糊。 让我总结一下。
我写的都是我自己的理解。 由于我通常从事实际的项目和业务,所以我只会写到我理解我所看到的为止。
欢迎讨论,如有错误请指正。
概述
编译的目的:将代码(.cpp)翻译成机器可以理解的二进制文件(.o for linux,.obj for win)
链接的目的:将目标文件(linux 为.o,win 为.obj)转换为可执行文件(linux 为.out,win 为.exe)。 随后,可以将代码与可执行文件分离。 例如,可以将可执行文件单独放在服务器上运行。
可执行文件可以在其他地方直接运行。 该图是与BP神经网络的前向程序相关的概念。
1.():将cpp代码翻译成机器语言并保存到目标文件中。 CPP->OBJ。
2.编译单元(Unit):这里指的是一个.cpp文件和所有.h文件。 .h 文件中的代码将扩展为包含它的 .cpp 文件,然后编译器编译该 .cpp 文件。 作为 .obj 文件
一对 .cpp 和 .h
3、目标文件(Obj File):编译后生成的文件,以机器码的形式包含编译单元中的所有函数和数据、导出的符号表、未解析的符号表、地址重定向表等。要点:包括可重定位文件(.o、.obj 文件)和库文件(.a、.so 文件)
4.编译器():将一种语言(通常是高级语言)翻译成另一种语言(通常是低级语言)的程序
5、静态链接库(.so):多个目标文件的集合
6.动态链接库(.a):另一个可执行文件与其他目标文件组合在一起。 动态链接库只有在程序执行时才会被调用。
参考另一位博主的介绍
7、链接:链接器的主要工作是将相关的目标文件(库文件、.o文件)相互连接起来,最终转化为可执行文件。理解:主要是定位各个函数数据,定位地址,查找每个未解析符号的定义
编译、链接和执行过程
编写代码:假设你已经编写了如下代码a.cpp、ah、b.cpp、bh以及需要链接的库c.so。 编译两个单元a和b。 链接所有目标文件和库以生成可执行文件。
下次内容应该是g++和cmake
参考内容: