C++

Guide to CMakeLists.txt

Summary about Cmake compilation

Posted by Huajian on October 17, 2022
Viewed times

Reference - configuration of CMake

Reference - Cmake Practice

序言

在这篇文章中,我想分布介绍 CMakeLists.txt 中的的各个组件。在实际应用中只需将组件结合即可实现编译需求。

Basic Configuration

  • 设置cmake最低版本如 3.10
    cmake_minimum_required(VERSION <X.X>)

  • 项目名称
    project(<project_name>)

  • 设置C++版本
    set(CMAKE_CXX_STANDARD 14)

  • 查找并添加第三方依赖
    find_package(<package_name> REQUIRED include_directories(<dir_path>)

    Example:

      find_package( OpenCV REQUIRED )
      include_directories( ${OpenCV_INCLUDE_DIRS} <other_directory> ...)
    

Library

  • 添加动态库和静态库
    add_library(<library_name> STATIC/SHARED <source_files>)

    library_name 将作为一个 target 以供后续使用

    Example:

      LIST(APPEND LIB_FILES "lib/algo.h" "lib/algo.cpp")
      add_library(lib STATIC ${LIB_FILES})
    

    以下部分放在add_executable之后

  • 添加头文件
    INCLUDE_DIRECTORIES(./include)

  • 将头文件包含在库中/链接library的目录
    target_include_directories(<target> PUBLIC/PRIVATE <include_path>)
    example:
    target_include_directories(${LIBRARY_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

区别:
INCLUDE_DIRECTORIES 指向了此CMakeList中的所有target
相比之下,target_include_directories仅用于特定目标
因此如果Project的所有目标都指向同样的头文件组那么第一个就足够了

  • 为target添加需要链接的共享库,target可以是可执行文件或自定义的共享库 target_link_libraries(<target> <library_name> ...)

Executable

  • 添加需要编译的源码,生成可执行文件 file_name。通常,file_nameproject_name 一致

    file_name 也将作为一个 target 以供后续使用

      add_executable(${PROJECT_NAME} 
                      <main>.cpp
                      <file1>.cpp
                      <file2>.cpp
                      <file1>.hpp
                      ...
                      )              
    
  • 处理源文件数量很多的情况
    aux_source_directory(dir var)
    • dir: 源文件目录,用 . 表示当前目录
    • var: 将目录内的文件存入一个变量中,以供接下来使用
      aux_source_directory(. SOURCES)
    
      add_executable(${PROJECT_NAME}  ${SOURCES})
    
  • 处理有多个子目录的情况

    在项目的最外层CMakeList.txt中加入add_subdirectory(subdir)
    子目录的CMakeList.txt中没有project()

    Example:

  • 进一步的,如果不想将所有源文件添加,则可以使用 set 将文件包起来
    set(<var> <value1> <value2>) 用于定义变量,后续可以使用 ${var} 来索引变量

      set( SOURCES
          ./main.c
          ./testFunc1.c
          ./testFunc.c)
    
  • Alternative: 用list存储文件名,再执行add_executable

      LIST(APPEND HEADER_FILES "util.h" "constants.h")
      LIST(APPEND SOURCE_FILES "main.cpp")
    
      add_executable(${PROJECT_NAME}  ${SOURCE_FILES} ${HEADER_FILES})
    

make install

see links


Top
Down