CMake是一个开源的跨平台自动化构建系统。CMake作为一个跨平台的构建工具,其强大的抽象能力和广泛的适用性使其成为现代C++开发中不可或缺的工具。
CMake支持大写、小写、混合大小写的命令。如果在编写CMakeLists.txt文件时使用的工具有对应的命令提示,那么大小写随缘即可,不要太过在意。
1.CMake注释:
CMake的注释使用 "#"
# cmake_niminum_required(VERSION 2.8)
2.CMake版本控制
cmake_niminum_required(VERSION 2.8)
代表Cmake支持的最低版本。
3.指定项目名称
project(name)
name就是项目名称,可以随便取。
4.简单项目构建
准备工作:
math.h
#include<iostream>
#include<vector>
using namespace std;
double add(double x,double y);
double sub(double x,double y);
add.cpp
double add(double x,double y)
{
auto ret=x+y;
return ret;
}
sub.cpp
#include"math.h"
double sub(double x,double y)
{
return x-y;
}
main.cpp
#include<iostream>
#include"math.h"
using namespace std;
int main()
{
cout<<"add(10,20)="<<add(10,20)<<endl;
cout<<"sub(10,20)="<<sub(10,20)<<endl;
return 0;
}
源文件添加:
add_executable(name.exe 源文件)
CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8)
project(test_Cmake)
#添加源文件
#app 可执行程序的名称,add.cpp sub.cpp main.cpp源文件
add_executable(app add.cpp sub.cpp main.cpp)
执行步骤:
- cmake 路径——CMakeLists.txt所在的位置
- make
执行cmake 之后会生成makefile文件,make是为了执行makefile文件
5.set的使用
添加变量:
set(变量名 变量值)
变量值可以有多个组成,中间可以使用空格隔开
例如将多个源文件添加到变量:
set(filecpp main.cpp add.cpp sub.cpp)
取出变量值:
${变量名}
修改将上面的项目构建:
cmake_minimum_required(VERSION 2.8)
project(test_Cmake)
#添加源文件
set(filecpp add.cpp sub.cpp main.cpp)
add_executable(app ${filecpp})
指定C++标准
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
指定设置宏CMAKE_CXX_STANDARD的值,在指定cmake的时候指定这个宏。
cmake 路径 -DCMAKE_CXX_STANDARD=11
指定可执行程序输出路径
对指定的宏设置值,这个值就是可执行程序输出的路径
#指定可执行程序的输出路径
set(exeoutpath /home/wq/24_06_06/test/out)
set(EXECUTABLE_OUTPUT_PATH ${exeoutpath})
cmake + make 执行以后,出现out目录可执行程序也生成了。
6.搜索文件
aux_source_directory搜索文件
顾名思义,aux_source_directory可以搜索指定目录下的源文件。
#添加源文件
#指定源文件的路径去搜索
aux_source_directory(/home/wq/24_06_06/test filecpp)
#PROJECT_SOURCE_DIR的宏值是cmake执行的时候后面根的路径
aux_source_directory(${PROJECT_SOURCE_DIR} filecpp)
add_executable(app ${filecpp})
这样的写法节省了我们写大量的源文件。
file搜索文件
搜索文件 file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径/文件类型)。
GLOB :将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE :递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
路径 CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt的目录。
# 直接指定路径
file(GLOB filecpp /home/wq/24_06_06/test/*.cpp)
# ${CMAKE_CURRENT_SOURCE_DIR}就是CMakeLists.txt的所在路径
file(GLOB filecpp ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
add_executable(app ${filecpp})
7.指定头文件
一般整个项目我们会将,可执行程序,源码,头文件分开放置。但是这就导致一个问题,在部分源文件按中包含的头文件,就会因为路径问题找不到,所以cmake支持指定路径寻找头文件按。
include_directories(头文件路径)
这样即使我们不在源文件中指定完整的头文件路径,也能够编译通过。
8.生成动静态库
动静态库的很多特性我们早就已经探究过了,使用CMak可以非常方便的将源文件打包成动态/静态库。
可以使用 add_library(库名 SHARED/STATIC 源文件) 生成库。
SHARED:参数代表生成动态库,又叫共享库。
STATIC:参数代表生成静态库。
通过对 LIBRARY_OUTPUT_PATH 设置值可以指定库的生成路径。
例如:
cmake_minimum_required(VERSION 2.8)
project(test_Cmake)
#添加源文件
file(GLOB filecpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#头文件路径
set(headpath ${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${headpath})
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#设置库的输出路径
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/library)
#打动态库
add_library(Math1 SHARED ${filecpp})
#打静态库
add_library(Math2 STATIC ${filecpp})
9.链接动静态库
链接静态库
- 需要指定库名:link_libraries(库名) 。
- 需要指定库的所在路径:link_directories(库路径)
- 最后生成可执行程序
cmake_minimum_required(VERSION 2.8)
project(test_Cmake)
#指定源文件
file(GLOB filecpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#头文件路径
set(headpath ${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${headpath})
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#指定可执行程序输出路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/out)
# 1.获取库路径
set(libpath ${CMAKE_CURRENT_SOURCE_DIR}/library)
#2.指定库名
link_libraries(Math)
#3.指定库路径
link_directories(${libpath})
#4.链接静态库
add_executable(app ${filecpp})
链接动态库
- 指定库路径 link_directories(库路径)
- 生成可执行程序 add_executable(app 源文件)
- 最后链接动态库 target_link_libraries(app 库名)
cmake_minimum_required(VERSION 2.8)
project(test_Cmake)
#指定源文件
file(GLOB filecpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#头文件路径
set(headpath ${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${headpath})
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#指定可执行程序输出路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/out)
#1.获取库路径
set(libpath ${CMAKE_CURRENT_SOURCE_DIR}/library)
#指定库路径
link_directories(${libpath})
#2.生成可执行程序
add_executable(app ${filecpp})
#3.链接动态库
target_link_libraries(app Math)