Cmake的使用
发布日期:2021-05-15 08:56:44 浏览次数:25 分类:精选文章

本文共 1992 字,大约阅读时间需要 6 分钟。

CMake是一款跨平台的安装与编译工具,通过简单的语句可以描述多平台的安装与编译过程。它能够自动生成标准的构建文件(如Unix的Makefile或Windows的Visual Studio项目文件),并根据编译器支持的特性测试C++语言的各项功能。CMake的特点在于其配置文件CMakeLists.txt的统一管理,能够支持多种编译环境下的构建需求。

CMake的优点

  • 自动搜索依赖:CMake能够自动识别项目所需的库和头文件,并在搜索过程中考虑环境变量和注册表(在Windows平台)。
  • 构建目录与源码目录分离:允许在源码目录之外单独创建构建目录,用于存放编译生成的中间文件。
  • 灵活的配置选项:在配置阶段可以选择需要包含的组件,并灵活切换静态库与共享库的构建方式。
  • 自动生成依赖关系:CMake能够自动识别项目依赖,并支持大多数平台的并行构建。
  • CMake的编译流程

    CMake的编译过程通常分为两个步骤:

  • 生成构建文件:使用cmake命令指向CMakeLists.txt文件,通常建议在新建的目录中执行,避免污染源码目录。
    mkdir build
    cd build
    cmake ..
  • 执行编译:根据生成的Makefile文件使用make命令进行编译。
    make
  • CMakeLists.txt文件编写指南

  • 基本配置
    cmake_minimum_required(VERSION 3.4.1)
    project(demo)
  • 打印信息
    message("项目名称: ${PROJECT_NAME}")
    message("项目目录: ${PROJECT_SOURCE_DIR}")
    message(WARNING "注意:这是一个警告信息")
    message(FATAL_ERROR "构建失败!")
  • 编译文件
    add_executable(demo demo.cpp)
    add_library(demo STATIC util.cpp)
    add_library(demo SHARED util.cpp)
  • 文件搜索与包含
    file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
    add_library(demo ${SRC_LIST})
  • 依赖库管理
    find_library(logLib log)
    target_link_libraries(demo ${logLib})
  • 构建目录设置
    include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    )
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")
    link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs)
  • 编译选项
    set(CMAKE_C_FLAGS_DEBUG "-g -Wall")
    set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
  • 常用CMake变量

  • 预定义变量
    • PROJECT_SOURCE_DIR:项目根目录
    • PROJECT_BINARY_DIR:当前CMake处理目录
    • CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt所在目录
    • CMAKE_CURRENT_BINARY_DIR:目标编译目录
  • 环境变量
    $ENV{PATH} = "${CMAKE_CURRENT_BINARY_DIR}"
  • 系统信息
    • CMAKE_SYSTEM:系统名称(如Linux)
    • CMAKE_CXX:C++编译器命令
  • 主要开关选项
    • BUILD_SHARED_LIBS:控制库类型,默认静态库
    • CMAKE_CXX_FLAGS:C++编译选项
  • 示例应用

    if(${USER_TARGET_OS} STREQUAL "qnx")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14 -Wall -DHAS_SOMEIP_BINDING")
    elseif(${USER_TARGET_OS} STREQUAL "linux")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14 -pthread -Wall -DHAS_SOMEIP_BINDING")
    endif()

    通过合理配置CMakeLists.txt文件,开发者可以充分利用CMake的优势,简化跨平台构建流程,提升开发效率。

    上一篇:Linux常用命令合集
    下一篇:c++工程中调用c文件或c库

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月21日 07时40分52秒