使用CMake编译多个目录下的C++代码并生成可执行程序
CMake是一个跨平台的构建系统,可以有效地管理多目录C++项目。下面我将介绍如何使用CMake来组织多目录C++项目并生成可执行程序。
基本项目结构示例
假设我们有以下项目结构:
复制
project/ ├── CMakeLists.txt # 根CMake文件 ├── main.cpp # 主程序文件 ├── include/ # 公共头文件目录 │ └── utils.h └── src/ # 源代码目录 ├── utils.cpp └── subdir/ ├── helper.cpp └── helper.h
编写CMakeLists.txt
1. 根目录的CMakeLists.txt
cmake
复制
cmake_minimum_required(VERSION 3.10) # 指定CMake最低版本 # 设置项目名称和使用的语言 project(MyProject CXX) # 设置C++标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加可执行文件 add_executable(${PROJECT_NAME} main.cpp src/utils.cpp src/subdir/helper.cpp ) # 包含头文件目录 target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/subdir )
2. 更模块化的写法(推荐)
对于更大的项目,可以使用更模块化的方式:
cmake
复制
cmake_minimum_required(VERSION 3.10) project(MyProject CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加子目录(会自动查找子目录中的CMakeLists.txt) add_subdirectory(src) add_subdirectory(include) # 创建可执行文件 add_executable(${PROJECT_NAME} main.cpp) # 链接库(如果有的话) target_link_libraries(${PROJECT_NAME} PRIVATE MyLib)
3. src/CMakeLists.txt
在src目录下创建CMakeLists.txt:
cmake
复制
# 创建一个库(可选) add_library(MyLib STATIC utils.cpp subdir/helper.cpp ) # 设置包含目录 target_include_directories(MyLib PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/subdir )
构建项目
-
创建一个构建目录并进入:
bash
复制
mkdir build cd build
-
运行CMake生成构建系统:
bash
复制
cmake ..
-
编译项目:
bash
复制
cmake --build .
高级用法
1. 自动查找源文件
可以使用file(GLOB ...)
自动查找源文件:
cmake
复制
file(GLOB SOURCES "src/*.cpp" "src/subdir/*.cpp") add_executable(${PROJECT_NAME} ${SOURCES})
注意:这种方法在添加新文件时需要重新运行CMake。
2. 条件编译
cmake
复制
option(USE_FEATURE_X "Enable feature X" ON) if(USE_FEATURE_X) add_definitions(-DUSE_FEATURE_X) list(APPEND SOURCES src/feature_x.cpp) endif()
3. 添加第三方依赖
cmake
复制
find_package(Boost REQUIRED COMPONENTS filesystem system) target_link_libraries(${PROJECT_NAME} PRIVATE Boost::filesystem Boost::system)
完整示例
假设有以下结构:
复制
project/ ├── CMakeLists.txt ├── main.cpp ├── include/ │ └── math_utils.h └── src/ ├── math_utils.cpp └── graphics/ ├── shapes.cpp └── shapes.h
CMakeLists.txt:
cmake
复制
cmake_minimum_required(VERSION 3.10) project(MyGraphicsApp CXX) set(CMAKE_CXX_STANDARD 17) # 查找所有源文件 file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*/*.cpp" ) # 创建可执行文件 add_executable(${PROJECT_NAME} ${SOURCES} main.cpp ) # 包含头文件目录 target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src/graphics ) # 在Windows上使用控制台子系统 if(WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE -Wl,--subsystem,console) endif()
通过以上方法,你可以有效地组织多目录C++项目并使用CMake构建可执行程序。