cmake编译选项

CMake是一个跨平台的构建系统,它可以根据简单的配置文件生成各种平台的构建工具(例如Makefile、Visual Studio项目文件等)。CMake使用CMakeLists.txt文件来描述项目的构建规则和依赖关系。在这个文件中,可以设置各种编译选项。

  1. 设置C++标准:

    1
    2
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)

    这里设置了项目使用C++11标准进行编译,并且如果编译器不支持C++11,CMake会报错。

  2. 设置编译器选项:

    1
    2
    3
    4
    5
    if (MSVC)
    add_compile_options(/W4 /WX)
    else()
    add_compile_options(-Wall -Wextra -Werror)
    endif()

    这个示例为不同的编译器设置了不同的编译选项。对于Microsoft Visual Studio编译器,它将警告级别设置为/W4并将所有警告视为错误。对于其他编译器(如GCC、Clang),它将启用所有警告、额外警告,并将警告视为错误。

  3. 添加定义:

    1
    add_definitions(-DENABLE_DEBUG)

    这将为项目添加一个宏定义ENABLE_DEBUG。在C++代码中,可以使用#ifdef ENABLE_DEBUG检查宏是否定义。

  4. 设置优化选项:

    1
    set(CMAKE_BUILD_TYPE Release)

    这将设置构建类型为”Release”,通常表示编译器会启用优化选项。CMake支持多种构建类型,如Debug、Release、RelWithDebInfo和MinSizeRel。

  5. 设置项目输出目录:

    1
    2
    3
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

    这将设置项目的可执行文件、库文件和静态库文件的输出目录。

  6. 设置依赖库:

    1
    2
    find_package(Threads REQUIRED)
    target_link_libraries(my_project PRIVATE Threads::Threads)

    这个示例会在系统上查找线程库(例如POSIX Threads)。如果找到了线程库,它会链接到名为my_project的目标。

    这些仅仅是CMake设置编译选项的一些基本示例。CMake提供了许多配置选项和命令,可以根据项目的需求进行灵活的定制。有关CMake的更多信息,请参阅CMake官方文档

基于esp-idf开发esp32时,idf.py工具对cmake做了一些封装,但基本兼容,cmake具有的子命令,idf.py基本都有。

下面是esp-idf开发esp32常用的CMakeLists.txt示例:

  1. 在项目的根目录下创建一个名为CMakeLists.txt的文件。这个文件将包含项目的编译选项和构建规则。以下是一个简单的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    # 设置CMake的最低版本要求
    cmake_minimum_required(VERSION 3.5)

    # 包含ESP-IDF的CMake工具链文件
    include($ENV{IDF_PATH}/tools/cmake/project.cmake)

    # 设置项目名称和项目中的源文件
    project(my_project)
  2. 在项目的组件目录下(通常为components)创建一个名为CMakeLists.txt的文件。这个文件将包含组件的编译选项和构建规则。以下是一个简单的示例:

    1
    2
    3
    # 注册组件
    idf_component_register(SRCS "my_component.c"
    INCLUDE_DIRS "include")
  3. 设置编译选项:在 CMakeLists.txt 文件中,使用 target_compile_options 函数来设置编译选项。例如,要启用C++11支持,可以添加以下代码:

    1
    2
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
  4. 使用 idf.py 工具进行编译和构建。在项目根目录下,运行以下命令:

    1
    idf.py build

    这将使用CMake和ESP-IDF工具链编译项目,并生成二进制文件。

  5. 如果需要更改默认编译选项,可以在CMakeLists.txt中使用target_compile_definitionstarget_compile_features等函数。例如:

    1
    2
    3
    4
    5
    # 添加编译定义
    target_compile_definitions(${COMPONENT_TARGET} PRIVATE MY_DEFINE=value)

    # 添加编译选项
    target_compile_options(${COMPONENT_TARGET} PRIVATE -Werror)

参考文档: