1.编译是什么?
简单的说,就是将文本文件转化为obj对象。详细的说包含以下三个步骤:
(1)预处理代码。常用的预处理语句包含#include、if、ifdef、pragma。经过这一阶段 main.cpp变为main.i
这种文件里的内容就是在原文件的基础上做点修改,比如include 就是把这个库里面几千行代码加上去。就是说,如果你main.cpp只写了几行,include 后,你预处理后生成的main.i文件就有几千行了。
(2)词法分析、语法分析、语义分析、优化后,生成汇编代码文件。经过这一阶段main.i变为main.s
这种文件里的内容就是(微机原理学的)那些mov,push,call那些汇编指令构成的。
(3)汇编。将汇编码转化为机器码。经过这一阶段main.s变为main.o
这种文件里的内容全是机器码了,0和1了,只有机器看得懂了。
2.链接是什么?
简单的说,就是“打包”,它将所有的目标文件以及系统组件组合成一个可执行文件。
实际过程中,不会只有一个文件,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。这些问题,经链接程序的处理得以解决。
比如写了两个cpp文件,main_1.cpp main_2.cpp 其中1里面用到了2里面的函数,经过编译后,会生成两个obj文件,然后链接的作用就是帮忙在2里面找1要用的函数,然后两个打包生成一个exe文件。
3.build是什么?
build=编译+链接
4.CMake是什么?
CMake是一个跨平台的构建自动化工具,它可以自动生成跨平台的Makefile、Visual Studio等IDE项目、Xcode项目和Ninja build等常见项目文件。CMake的工作方式是通过读取CMakeLists.txt文件中的指令来生成相应的项目文件,从而支持多种编译器、操作系统、硬件架构等,为跨平台开发提供方便。
CMake能够自动检测在系统中已经安装的库和头文件,从而避免了手动配置环境变量和链接库的繁琐工作。此外,CMake还允许开发者自定义编译选项和平台特定的配置,从而使软件可以在多个平台上正确地编译和运行。
CMake还有一个很重要的优点,就是可以与其他构建工具(如make、Visual Studio等)无缝集成。这意味着开发者可以使用CMake来生成构建文件,然后将这些文件用作其他构建工具的输入,从而实现更高效的自动化构建过程。
5.如何用Cmake进行编译?
src文件夹中文件结构如下图所示:
上图中的ugv_os文件夹中的文件结构如下图所示:
可以看到ugv_os里面有CMakeLists.txt文件(注意与上一级目录中的CMakeLists.txt文件相区别,这个文件才是进行自己的工程编译时需要用到的文件),所以cmake需要引用的是这个路径。
编译时,在ugv_os的同级,目录下创建一个build文件夹。在build文件夹中打开终端,输入:
cmake ../ugv_os
运行完之后,再在该终端中输入:
make -j8
完成编译。
6.CMAKE_CURRENT_SOURCE_DIR代表什么?
CMAKE_CURRENT_SOURCE_DIR是CMake定义的一个变量,它代表当前CMakeLists.txt文件所在的目录。在CMake项目中,可以使用这个变量来引用当前目录中的文件。