Basic concept of CMake
- CMake的优势:
The power of CMake comes from the fact that you can use the same build specification –that is, CMakeLists.txt – for various compiler toolchains without the need to rewrite anything. - 关于生成器:(调节-G参数)
分为单目标生成器(各种Make和Ninja)和多目标生成器(Visual Studio和XCode),它们都是写在CMAKE_MAKE_PROGRAM:FILEPATH里的 - 关于工具链:(调节CMAKE_CXX_COMPILER)
This toolchain is stored in the cache, so if the toolchain changes, the cache must be deleted and rebuilt. Avoid setting the compiler toolchain inside the CMakeLists.txt files. - 编译模式:(调节-DCMAKE_BUILD_TYPE:STRING参数)
(1)Debug,用于打断点调试,相当于GCC的 -O0 -g (2)Release,调试好了用于运行,相当于GCC的-O3 -DNDEBUG (3)RelWithDebInfo,调好了,自己这边感觉没问题了,给用户测试;如果测试出啥问题,用户那边还能出现debug的信息,相当于GCC的 -O2 -g -DNDEBUG (4)MinSizeRel,最小大小发布,相当于-Os -DNDEBUG Note that the build types must be passed during the configuration state and are only relevant for single-target generators such as CMake or Ninja. For multi-target generators such as MSVC, they are not used, as the build-system itself can build all build types. - 各种目录,不确定的话用message打印出来
(1) PROJECT_SOURCE_DIR: 当前项目源码路径 (2)PROJECT_BINARY_DIR: 当前项目输出路径 (3)CMAKE_SOURCE_DIR: 根项目源码路径 (4)CMAKE_BINARY_DIR: 根项目输出路径
单一文件到可执行文件的编译
项目组织架构如下
cmake_minimum_required(VERSION 3.21)
project(
hello_world_standalone # 项目的名字
VERSION 1.0 # 项目的版本号
DESCRIPTION"A simple C++ project" # 项目的描述,可有可无
HOMEPAGE_URL https:
Practices # 项目的主页,可有可无
LANGUAGES CXX # 项目语言是C++,如果不指定这个变量,默认是C和C++
)
# 指定输出EXE文件的路径,如果不指定默认就在build目录下,
# 下边其实是指定了在Bin目录下,当然需要自己先创建一个
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Bin)
add_executable(hello_world)# 可执行文件的名字,不要和项目的名字相同
target_sources(hello_world PRIVATE src/main.cpp)
# 或者 add_executable(hello_world src/main.cpp)
# target_sources 可以指定PRIVATE PUBLIC INTERFACE三个属性,但后两个只对库文件有意义
# PRIVATE属性是指,这个文件只对这个Target有用
配置并编译这个程序(下边这两行可以直接写成.bat或者.sh形式)
cmake -S . -B ./build -G "MinGW Makefiles"
cmake --build ./build --parallel 4
配置过程中的一些Flag
文件+自己的库
项目组织架构如下 想通过my_dll.cpp生成数学计算的函数库,利用main.cpp测试这个库是不是好使,如果好使了,把这个库发布到lib_out文件夹里边,方便别人拷走用
cmake_minimum_required(VERSION 3.16)
project(dll_learn)
# 设置C++的标准是C++20
set(CMAKE_CXX_STANDARD 20)
# 声明引入子项目(目录),声明的这个子目录里一定是有一个CMakeLists.txt的!
add_subdirectory(libs)
# 新增一个可执行文件
add_executable(main main.cpp)
# 增加库文件
target_link_libraries(main PUBLIC my_dll)
# 增加库文件对应的头文件,这样就可以 #include <my_dll.h>
# 通过 target_include_directories 指定的路径会被视为与系统路径等价
target_include_directories(main PUBLIC ./libs)
- 内层的CMakeLists.txt,子目录的 CMakeLists.txt 里路径名都是相对路径
# 声明这是一个动态库,静态库用STATIC
add_library(my_dll SHARED my_dll.cpp)
# 定义 hellolib 的头文件搜索路径,这里的.表示就在这个目录下
target_include_directories(my_dll PUBLIC .)
# 利用${PROJECT_SOURCE_DIR}/build 定位到CREATE LIBS/build目录
# 同样当测试好之后,可以把这个build改成lib_out
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
配置并编译这个程序
cmake -S . -B ./build -G "MinGW Makefiles"
cmake --build ./build --target my_dll --parallel 4
多文件编译
项目组织架构如下
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.22)
# 项目名称, 参数值是 Demo1, 该命令表示项目的名称是 Demo1
project(Demo1)
# 保证中文不出问题
set (CMAKE_CXX_FLAGS "-fexec-charset=GBK")
# 头文件包含位置
include_directories(${PROJECT_SOURCE_DIR}/Include)
# 指定输出EXE文件的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Bin)
# 源文件包含位置
# https:
# aux_source_directory(./Src sources)
# aux_source_directory(别的目录 sources)
# 或者用这个
file(GLOB_RECURSE sources CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/Src
文件+第三方库(比如Eigen)
Eigen库放在了“D:\Programming\eigen-3.4.0\eigen-3.4.0\Eigen”下边,这时候CMakeLists.txt为
cmake_minimum_required(VERSION 3.16)
project(dll_learn)
set(CMAKE_CXX_STANDARD 20)
# 声明引入子项目(目录)
add_subdirectory(libs)
add_executable(main main.cpp)
target_link_libraries(main PUBLIC my_dll)
target_include_directories(main PUBLIC ./libs)
# 这里的斜杠方向一定要注意!!!
target_include_directories(main PUBLIC "D:/Programming/eigen-3.4.0/eigen-3.4.0/Eigen")
|