Cmake学习

Cmake

CMake 是一个构建系统生成器,它把你的构建意图(CMakeLists.txt)转换成具体的编译命令,让你可以用任何编辑器、在任何平台、用任何编译器构建项目,同时自动处理头文件路径、库依赖等复杂问题

安装

wsl --install -d Ubuntu-24.04    # 先安装ubuntu版本
sudo apt-get update
sudo apt-get upgrade -y
sudo apt install build-essential cmake -y    # 安装cmake工具

简易指令

cmake_minimum_required(VERSION 3.15)    # VERSION 指定Cmake的版本号
project(test)                          # 该项目的名称,可以自定义
add_executable(app add.cpp div.cpp mult.cpp main.cpp sub.cpp)    # 生成的可执行文件+要用到的文件
# 之后使用cmake + CMakeLists所在路径 进行编译
cmkae .        # 表示当前目录
cmake ..    # 表示CMakeLists在上一级目录
make        # 生成可执行文件

#同样可以先创建build文件夹,之后使用cmake .. 这样生成的编译文件都在build中
mkdir build     # 在项目目录下创建build文件夹
cmake ..        # 在build中生成编译文件
make 
cmake .. 应该叫:
✅ 配置(Configure)
✅ 生成构建系统(Generate Build System)


make 应该叫:
✅ 构建(Build)
✅ 编译链接(Compile & Link)
✅ 生成可执行文件(Generate Executable)
✅ 构建项目(Build Project)

引入变量

cmake_minimum_required(VERSION 3.15)
project(test)
set(SRC add.cpp div.cpp mult.cpp main.cpp sub.cpp)        # 设置变量名字为SRC,SRC所指的是后面的文件
set(EXECUTABLE_OUTPUT_PATH /home/arthur/Cmake_Learn/Test1/aa/bb/cc)     # 指定生成可执行文件的目录
set(CMAKE_CXX_STANDARD 11)                            # 设定C++ 标准为11
add_executable(app ${SRC})

搜索文件

cmake_minimum_required(VERSION 3.15)
project(test)
# 自动收集指定目录下的所有源文件 放到SRC这个变量,不会进入子目录(可能也会搜到测试文件进行编译)
# 这个宏PROJECT_SOURCE_DIR目录是执行cmake 后面对应的目录
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)        
set(EXECUTABLE_OUTPUT_PATH /home/arthur/Cmake_Learn/Test1/aa/bb/cc)
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})
cmake_minimum_required(VERSION 3.15)
project(test)
# GLOB就是不递归搜索(不进入子目录)
# CMAKE_CURRENT_SOURCE_DIR 宏是CMakeLists.txt所在的目录和PROJECT_SOURCE_DIR一样
# /*.cpp 指的是在该目录下找.cpp文件
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
set(EXECUTABLE_OUTPUT_PATH /home/arthur/Cmake_Learn/Test1/aa/bb/cc)
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})

指定头文件路径

cmake_minimum_required(VERSION 3.15)
project(test)
# 指定cpp文件所在位置
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 指定头文件(.h)文件所在位置
include_directories(${PROJECT_SOURCE_DIR}/inc)
set(EXECUTABLE_OUTPUT_PATH /home/arthur/Cmake_Learn/Test1/bin)
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})

通过Cmake制作库文件

Linux中
静态库名字分为三部分:lib+库名字+.a
动态库名字分为三部分:lib+库名字+.so

静态库

cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/inc)
set(LIBRARY_OUTPUT_PATH  /home/arthur/Cmake_Learn/Test2/lib)    # 指定生成库文件的位置
add_library(calc STATIC ${SRC})            # STATIC 生成静态库

动态库

cmake_minimum_required(VERSION 3.15)
project(test)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)    # 指定源文件
include_directories(${PROJECT_SOURCE_DIR}/inc)            # 指定头文件
set(LIBRARY_OUTPUT_PATH  /home/arthur/Cmake_Learn/Test2/lib)
add_library(calc SHARED ${SRC})                        # SHARED 生成动态库

程序中链接静态库

cmake_minimum_required(VERSION 3.15)
project(test)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/inc)
link_libraries(calc)                            # 链接到对应的库文件
link_directories(${PROJECT_SOURCE_DIR}/lib1)      # 链接到对应库文件的目录

# set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})

程序中链接动态库

cmake_minimum_required(VERSION 3.15)
project(test)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/inc)
link_directories((${PROJECT_SOURCE_DIR}/lib2)        # 指定动态库目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

# set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})
target_link_libraries(app calc)        # 把calc这个动态库以默认的Public模式链接到app上

在cmake 中打印日志信息

(无) :重要消息
STATUS :非重要消息
WARNING :CMake 警告, 会继续执行
AUTHOR_WARNING :CMake 警告 (dev), 会继续执行
SEND_ERROR :CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR :CMake 错误, 终止所有处理过程

# 输出一般日志信息
message(STATUS "source path: ${PROJECT_SOURCE_DIR}")
# 输出警告信息
message(WARNING "source path: ${PROJECT_SOURCE_DIR}")
# 输出错误信息
message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}")

变量操作

# 字符串的拼接
set(tmp hello world)
set(tmp1 ${tmp} ${SRC})
message(${tmp})
message(${tmp1})
list(APPEND tmp "xx1" "sss2" ${SRC})
message(${tmp})

# 字符串的删除
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
message("============")
message(${SRC})
list(REMOVE_ITEM SRC ${PROJECT_SOURCE_DIR}/src/main.cpp)
message("============")
message(${SRC})
message("============")

添加新评论