参考链接:https://www.bilibili.com/video/BV16V411k7eF?p=8&spm_id_from=pageDriver
-
编译过程:
gcc -E main.c -o main.i
通过-E
生成预处理文件gcc -S main.i
对预处理文件进行编译生成main.sgcc -c main.s
对文件进一步汇编生成main.ogcc main.o -o main
最后生成可执行文件 -
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
CMake 就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。
-
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
- 编写 CMake 配置文件 CMakeLists.txt 。
- 执行命令
cmake PATH
或者ccmake PATH
生成 Makefile(ccmake
和cmake
的区别在于前者提供了一个交互式的界面)。其中,PATH
是 CMakeLists.txt 所在的目录。 - 使用
make
命令进行编译。
-
demo1的Cmake的简单实现
demo1中有功能为打印
hello world
的main.cpp
文件或者其他.cpp
文件。首先新建并编辑CMakeLists.txt文件:
vim CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) #版本号 PROJECT(demo1) #工程名 ADD_EXECUTABLE(demo1 main.cpp) #可执行文件,有main.cpp生成demo1的可执行文件
然后在当前文件下执行cmake操作:
cmake ./
其中,./
表示在当前文件下。可以查看文件中已经有Makefile,就可以执行
make
命令进行编译,生成可执行文件demo1。 -
demo2的CMake实现(demo2中存在多个.cpp文件用变量来代替)
demo2中存在两个cpp文件,main.cpp和test1.cpp。
首先新建并编辑CMakeLists.txt文件:
vim CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) PROJECT(demo2) AUX_SOURCE_DIRECTORY(./ DIR_SRCS) #./为当前文件夹下,发现一个目录下所有的源代码文件并将列表存储在一个变量中 ADD_EXECUTABLE(demo2 ${DIR_SRCS}) #这里只使用变量就可以调用所有的源文件cpp
然后在当前文件下执行cmake操作:
cmake ./
其中,./
表示在当前文件下。可以查看文件中已经有Makefile,就可以执行
make
命令进行编译,生成可执行文件demo2。 -
demo3的CMake实现(demo3中多目录多文件)
demo3中存在多个文件夹,且文件夹中也有源文件cpp等。
先对demo3中的文件夹进行CMake,进入demo3中子文件夹的CMakeLists.txt:AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS) #.为当前文件夹下,发现一个目录下所有的源代码文件并将列表存储在一个变量中 add_library(Mylib STATIC ${DIR_LIB_SRCS}) #生成静态库,提供外面使用
然后对demo3进行总的CMake,编辑demo3文件中的CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) PROJECT(demo3) ADD_SUBDIRECTORY(./mylib) #向当前工程添加存放源文件的子目录 AUX_SOURCE_DIRECTORY(./ DIR_SRCS) ADD_EXECUTABLE(demo3 ${DIR_SRCS}) TARGET_LINK_LIBRARIES(demo3 Mylib) #为项目demo3添加需要链接的共享库
然后在当前文件下执行cmake操作:
cmake ./
其中,./
表示在当前文件下。可以查看文件中已经有Makefile,就可以执行
make
命令进行编译,生成可执行文件demo3。 -
demo4的CMake实现(标准工程)
在demo4中创建如下工程:
. ├── build ├── CMakeLists.txt ├── mylib │ ├── CMakeLists.txt │ ├── test1.cpp │ └── test1.hpp └── src ├── CMakeLists.txt └── main.cpp
首先编辑src中的CMakeLists.txt:
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib) AUX_SOURCE_DIRECTORY(./ DIR_SRCS) ADD_EXECUTABLE(demo4 ${DIR_SRCS}) TARGET_LINK_LIBRARIES(demo4 Mylib)
编辑mylib中的CMakeLists.txt:
AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS) ADD_LIBRARY(Mylib STATIC ${DIR_LIB_SRCS})
编辑总的CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10) PROJECT(demo4) ADD_SUBDIRECTORY(./mylib) ADD_SUBDIRECTORY(./src)
最后执行编译和运行
cd build #在build中编译 cmake .. # ..为上一级目录,因为CMakeLists.txt在上一级 make ./src/demo4 #运行demo4