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("============")