cmake
cmake介绍
本文完全参考https://blog.csdn.net/whahu1989/article/details/82078563
cmake是什么
cmake是实现软件跨平台,保证软件能在不同平台编译的一种工具,它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。
cmake安装
由于公司电脑均已经安装好了,后续有时间再来补
- windows安装cmake
- linux安装cmake
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
-
编写 CMake 配置文件 CMakeLists.txt 。
main.c
CMakeLists.txt -
执行命令
cmake PATH
或者ccmake PATH
生成 Makefile 。ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。其中,PATH
是 CMakeLists.txt 所在的目录。
除了main.c文件和CMakeLists.txt文件外,cmake之后还会产生一个文件夹和三个文件 -
使用 make 命令进行编译,编译完成之后生成可执行文件
同一目录下多个源文件
如果增加多个源文件和头文件,使用aux_source_directory把当前目录下的源文件存列表存放到变量SRC_LIST里,然后在add_executable里调用SRC_LIST
cmake_minimum_required (VERSION 2.8)
project (demo)
aux_source_directory(. SRC_LIST)
add_executable(main ${SRC_LIST})
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下
cmake_minimum_required (VERSION 2.8)
project (demo)
set( SRC_LIST
./main.c
./testFunc1.c
./testFunc.c)
add_executable(main ${SRC_LIST})
最终执行结果:
不同目录下多个源文件
把之前的testFunc.c和testFunc.h放到test_func目录下,testFunc1.c和testFunc1.h则放到test_func1目录下。
其中,CMakeLists.txt和main.c在同一目录下,内容修改成如下所示,
cmake_minimum_required (VERSION 2.8)
project (demo)
include_directories (test_func test_func1)
aux_source_directory (test_func SRC_LIST)
aux_source_directory (test_func1 SRC_LIST1)
add_executable (main main.c ${SRC_LIST} ${SRC_LIST1})
include_directories。该命令是用来向工程添加多个指定头文件的搜索路径,路径之间用空格分隔。
因为main.c里include了testFunc.h和testFunc1.h,如果没有这个命令来指定头文件所在位置,就会无法编译。当然,也可以在main.c里使用include来指定路径,如下
#include "test_func/testFunc.h"
#include "test_func1/testFunc1.h"
最终结果
正规项目
在最外层目录下新建一个CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (demo)
add_subdirectory (src)
add_subdirectory(),这个命令可以向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置
这里指定src目录下存放了源文件,当执行cmake时,就会进入src目录下去找src目录下的CMakeLists.txt,所以在src目录下也建立一个CMakeLists.txt,内容如下,
aux_source_directory (. SRC_LIST)
include_directories (../include)
add_executable (main ${SRC_LIST})
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
里又出现一个新的命令set,是用于定义变量的,EXECUTABLE_OUT_PATH和PROJECT_SOURCE_DIR是CMake自带的预定义变量,其意义如下,
EXECUTABLE_OUTPUT_PATH :目标二进制可执行文件的存放位置
PROJECT_SOURCE_DIR:工程的根目录
所以,这里set的意思是把存放elf文件的位置设置为工程根目录下的bin目录。
下面来运行cmake,不过这次先让我们切到build目录下,然后输入以下命令,
cmake …
Makefile会在build目录下生成,然后在build目录下运行make,运行ok,我们再切到bin目录下,发现main已经生成,并运行测试
这里解释一下为什么在build目录下运行cmake?从前面几个case中可以看到,如果不这样做,cmake运行时生成的附带文件就会跟源码文件混在一起,这样会对程序的目录结构造成污染,而在build目录下运行cmake,生成的附带文件就只会待在build目录下,如果我们不想要这些文件了就可以直接清空build目录,非常方便。
另外一种写法:
前面的工程使用了2个CMakeLists.txt,这种写法是为了处理需要生成多个elf文件的情况,最外层的CMakeLists.txt用于掌控全局,使用add_subdirectory来添加要生成elf文件的源码目录。
如果只生成一个elf文件,那么上面的例子可以只使用一个CMakeLists.txt,可以把最外层的CMakeLists.txt内容改成如下,
cmake_minimum_required (VERSION 2.8)
project (demo)
aux_source_directory (src SRC_LIST)
include_directories (include)
add_executable (main ${SRC_LIST})
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
同时,还要把src目录下的CMakeLists.txt删除。
动态库和静态库的编译控制
推荐阅读
-
Linux源码安装mysql 5.5.13 (cmake编译)
-
OpenGL的环境搭建(cmake+glfw+glew+vs2017)
-
米尔MYD-YA157C中Qt的opencv库编译移植 cmake-gui
-
Windows下CMake编译VisualStudio2017工程项目
-
Linux-6.5下基于cmake28来编译安装mysql服务配置解析_MySQL
-
[cmake教程](一)cmake安装、环境搭建以及第一个项目
-
cmake ios终端下执行提示错误 iOS version not found, tested: [5.0;5.1;6.0;6.1;7.0;8.3]的解决方案
-
详解Android studio ndk配置cmake开发native C
-
cmake ios终端下执行提示错误 iOS version not found, tested: [5.0;5.1;6.0;6.1;7.0;8.3]的解决方案
-
详解Android studio ndk配置cmake开发native C