CMake

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)

执行步骤:

  1. cmake 路径——CMakeLists.txt所在的位置
  2. 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.链接动静态库

链接静态库

  1. 需要指定库名:link_libraries(库名) 。
  2. 需要指定库的所在路径:link_directories(库路径)
  3. 最后生成可执行程序
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})

链接动态库

  1. 指定库路径 link_directories(库路径)
  2. 生成可执行程序 add_executable(app 源文件)
  3. 最后链接动态库 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)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的代码爱吃辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值