Cmake构建工程

使用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
)

构建项目

  1. 创建一个构建目录并进入:

bash

复制

mkdir build
cd build
  1. 运行CMake生成构建系统:

bash

复制

cmake ..
  1. 编译项目:

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构建可执行程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值