CMake Help

103 阅读1分钟

文件结构

- project/
	- include/
	- src/
	- CMakeLists.txt

基本配置

cmake_minimum_required(VERSION 3.20) # 指定CMake版本号

project(
	myproject											# 工程名称 		 	  必填
	LANGUAGE CXX C 								# 语言 可多选	  非必填
	DESCRIPTION "my project"		 	# 描述				  非必填
	VERSION 0.1.0 								# 版本				  非必填
)

# 生成程序名称 源文件
add_executable(main src/main.cpp)
# 头文件包含目录
target_include_directories(main PRIVATE include)

初始化

cmake -S . -B cmake-build

-Ssource识别CMake源文件

-B生成目录

使用其他构建器

cmake -S . -B cmake-build -G "Ninja"

编译

cmake --build ./cmake-build/

--build指定输出文件夹

set(EXPORT_COMPILE_COMMANDS ON) # 启用LSP支持
target_compile_features(main PRIVATE cxx_std_17) # 指定用C++17版本编译

添加单元测试

- test/
	- test.cpp
	- CMakeLists.txt
# ./test/CMakeLists.txt
add_executable(cgmath ./cgmath.cpp)
add_test(NAME cgmath COMMAND $<TARGET_FILE:cgmath>)
cmake_minimum_required(VERSION 3.20) # 指定CMake版本号

project(myproject)

add_library(engine STATIC src/main.cpp core/...) # 编译静态库
target_include_directories(main PUBLIC include)
target_compile_features(main PRIVATE cxx_std_17) # 指定用C++17版本编译

target_link_libraries(cgmath RPIVATE engine)

include(CTest)
enable_testing()
add_subdirectory(test)

引入第三方库

使用CMake配置的库

添加3rdlibs文件夹并创建CMake文件

- 3rdlibs/
	- glfw/
	- CMakeLists.txt
# ./3rdlibs/CMakeLists.txt
add_subdirectory(glfw) # 导入子目录
#./CMakeLists.txt
...
add_subdirectory(3rdlibs)

target_link_library(engine PUBLIC glfw)

引入单头文件库

- 3rdlibs/
	- tomlplusplus/
		- ...
		- CMakeList.txt
	- CMakeLists.txt
# ./3rdlibs/tomlplusplus/CMakeLists.txt
add_libray(toml++ INTERFACE)
target_include(toml++ INTERFACE ./)
target_compile_features(toml++ INTERFACE cxx_std_17)

预编译头

target_precompile_headers(cgmath REUSE_FROM engine)

宏&复用

macro(AddTest target_name)
	add_executable(${taget_name} )
	add_test(NAME ${taget_name} PRIVATE $<TARGET_FILE:cgmath>)
	target_link_libraries(${taget_name} PRIVATE engine)
	target_precompile_headers(${taget_name} REUSE_FROM engine)
endmacro()

编译选项

option(ENGINE_BUILD_TEST "Should build unit test" OFF)

if (ENGINE_BUILD_TEST)
	include(CTest)
	enable_testing()
	add_subdirectory(test)
endif()
cmake --build ./cmake-build/ -ENGINE_BUILD_TEST=ON

设置变量

声明

set(engine_name engine)

使用

${engine_name}

添加文件

源文件

自动搜索目录中的源文件

aux_source_directory(./src engine_src)

输出

message("source file: ${enginge_src}")

头文件

file(GLOB engine_header_files ./include/core/*.hpp)
add_library(engine STATIC ${engine_src} ${engine_header_files})

递归搜索文件

file(GLOB_RECURESE engine_header_file ./include/*.hpp)