CMakeList.txt模板与 Visual Studio IDE 操作对比表
-
- [1. CMakeList.txt模板](#1. CMakeList.txt模板)
- [2. 项目构建方法](#2. 项目构建方法)
- [3. CMake 与 Visual Studio IDE 操作对比表](#3. CMake 与 Visual Studio IDE 操作对比表)
1. CMakeList.txt模板
bash
# ============================================================================
# 1.项目基本信息
# ============================================================================
catkin_minimum_required(VERSION 3.15)
project(ImageProcessor)
# ============================================================================
# 2.C++ 标准设置
# ============================================================================
set(CMAKE_CXX_STANDARD 17)
# ============================================================================
# 3.构建类型和编译选项
# ============================================================================
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
# ============================================================================
# 4.查找依赖库
# ============================================================================
# Eigen3
find_package(Eigen3 REQUIRED)
if(Eigen3_FOUND)
message(STATUS "Found Eigen3 version: ${EIGEN3_VERSION}")
endif()
# ============================================================================
# 5.包含目录
# ============================================================================
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/src
${EIGEN3_INCLUDE_DIRS}
)
# ============================================================================
# 6.创建静态库目标
# ============================================================================
add_library(ImageProcessorLib STATIC
${CORE_SOURCES}
${CORE_HEADERS}
${UTILS_SOURCES}
${UTILS_HEADERS}
)
# 为库目标设置包含目录(更现代的方式)
target_include_directories(ImageProcessorLib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# 为库目标链接依赖
target_link_libraries(ImageProcessorLib PUBLIC
${OpenCV_LIBRARIES}
# ============================================================================
# 7.创建动态库
# ============================================================================
add_library(ImageProcessorShared SHARED
${CORE_SOURCES}
${UTILS_SOURCES}
)
target_include_directories(ImageProcessorShared PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_link_libraries(ImageProcessorShared PUBLIC
${OpenCV_LIBRARIES}
Eigen3::Eigen
)
# ============================================================================
# 8.创建可执行文件目标
# ============================================================================
add_executable(ImageProcessorApp
src/main.cpp
)
# 链接库到可执行文件
target_link_libraries(ImageProcessorApp PRIVATE
ImageProcessorLib
)
# ============================================================================
# 9.安装规则
# ============================================================================
install(TARGETS ImageProcessorLib ImageProcessorApp
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
install(DIRECTORY include/
DESTINATION include
FILES_MATCHING PATTERN "*.h"
)
# 安装配置文件
install(FILES config/default_config.json
DESTINATION config
)
# ============================================================================
# 10.输出配置信息
# ============================================================================
message(STATUS "==============================================")
message(STATUS "Project: ${PROJECT_NAME} ${PROJECT_VERSION}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS "Build tests: ${BUILD_TESTS}")
message(STATUS "Build shared libs: ${BUILD_SHARED_LIBS}")
message(STATUS "Output directory: ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
message(STATUS "==============================================")
2. 项目构建方法
-
创建构建目录:在项目根目录下执行
mkdir build && cd build命令,实现源码与构建文件的物理隔离。 -
配置项目:进入build目录执行
cmake ..(...指向源码目录),自动生成平台特定构建文件。 -
执行构建:
Unix/Linux:直接运行
make命令Windows平台:使用Visual Studio打开生成的.sln解决方案,或执行
cmake --build . -
运行验证:构建完成后,在对应目录查找生成的可执行文件进行测试。
3. CMake 与 Visual Studio IDE 操作对比表
| CMake 命令 | Visual Studio IDE 操作 | 说明 |
|---|---|---|
| 项目和目标 | ||
project(MyProject) |
解决方案资源管理器中的项目名称 | 设置项目名称 |
add_executable(target src.cpp) |
添加源文件 + 配置类型选择"应用程序(.exe)" | 创建可执行文件 |
add_library(mylib STATIC src.cpp) |
配置类型 → "静态库(.lib)" | 创建静态库 |
add_library(mylib SHARED src.cpp) |
配置类型 → "动态库(.dll)" | 创建动态链接库 |
| 包含和链接 | ||
include_directories(path) |
C/C++ → 常规 → 附加包含目录 | 添加头文件搜索路径 |
target_include_directories(target ...) |
同上,但针对特定目标 | 更现代的写法 |
link_directories(path) |
链接器 → 常规 → 附加库目录 | 添加库文件搜索路径 |
target_link_libraries(target lib) |
链接器 → 输入 → 附加依赖项 | 链接库文件 |
| 编译选项 | ||
set(CMAKE_CXX_STANDARD 17) |
C/C++ → 语言 → C++ 语言标准 → ISO C++17 | 设置 C++ 标准 |
target_compile_options(target /W4) |
C/C++ → 常规 → 警告等级 | 编译器警告级别 |
target_compile_definitions(target -DDEBUG) |
C/C++ → 预处理器 → 预处理器定义 | 添加宏定义 |
set(CMAKE_CXX_FLAGS "/O2") |
C/C++ → 优化 → 优化级别 | 编译器优化选项 |
| 输出配置 | ||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) |
常规 → 输出目录 | 可执行文件输出路径 |
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${dir}) |
常规 → 输出目录 | 动态库输出路径 |
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${dir}) |
链接器 → 常规 → 输出文件 | 静态库输出路径 |
set_target_properties(target PROPERTIES OUTPUT_NAME "name") |
链接器 → 常规 → 输出文件名 | 自定义输出文件名 |
| 配置类型 | ||
set(CMAKE_BUILD_TYPE Release) |
工具栏配置下拉框 → Release | Release 配置 |
set(CMAKE_BUILD_TYPE Debug) |
工具栏配置下拉框 → Debug | Debug 配置 |
set(CMAKE_CONFIGURATION_TYPES "Debug;Release") |
配置管理器 → 添加/删除配置 | 多配置支持 |
| 条件编译 | ||
if(WIN32) ... endif() |
配置属性 → 生成事件 → 条件 | 平台特定设置 |
$<$<CONFIG:Debug>:flags> |
Debug/Release 配置分别设置 | 配置相关选项 |
| 高级选项 | ||
add_subdirectory(subdir) |
解决方案中添加新项目/子项目 | 添加子目录项目 |
add_dependencies(target dep) |
项目依赖项设置 | 设置项目依赖关系 |
set_target_properties(target PROPERTIES FOLDER "group") |
解决方案资源管理器中的筛选器 | 项目分组 |
install(TARGETS target DESTINATION bin) |
无直接对应,需手动复制 | 安装规则 |
| 源文件组织 | ||
file(GLOB SOURCES "src/*.cpp") |
手动添加所有 .cpp 文件到项目 | 批量添加源文件 |
| 其他常用 | ||
option(BUILD_SHARED_LIBS "Build shared" ON) |
配置管理器中自定义配置 | 构建选项开关 |
add_compile_options(/utf-8) |
C/C++ → 命令行 → 其他选项 | 额外编译选项 |