CMake
目前CMake已经成为C++默认的工具了,但CMake的复杂程度不亚于一门语言了,下面给出最核心的CMake语法。
# CMake项目目录
├───inc
├───src
│ └───main.cpp
└───CMakeLists.txt
CMakeLists基本模板
cmake_minimum_required(VERSION 3.28.0)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# C++ Modules支持
# set(CMAKE_CXX_MODULE_STD ON)
# set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD a9e1cf81-9932-4810-974b-6eccaf14e457)
project(PojectName)
if(MSVC)
# 获取编译器所在目录
get_filename_component(MSVC_COMPILER_DIR "${CMAKE_CXX_COMPILER}" DIRECTORY)
# 推断 MSVC 根目录(假设路径结构为 .../VC/Tools/MSVC/<version>/bin/Hostx64/x64)
get_filename_component(MSVC_ROOT_DIR "${MSVC_COMPILER_DIR}/../../../" ABSOLUTE)
# 构造 include 路径
set(MSVC_INCLUDE_DIR "${MSVC_ROOT_DIR}/include")
include_directories(${MSVC_INCLUDE_DIR})
endif()
file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cpp src/*.cc)
add_executable(PojectName srcs)
target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/inc>
)
使用库
导出库
很多时候我们需要使用CMake制作一个库并导出
- 在
CMakeList.txt
结尾:
include(GUNInstallDirs) # GUN安装包结构
include(CMakePackageConfigHelpers) # 包含配置帮助模块
# inc/为头文件目录,根据实际目录替换
install(DIRECTORY inc/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/)
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets)
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)
# 生成配置文件
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
)
- 创建一个名为
Config.camke.in
文件:
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.camke")