• CMake入门实例、宏变量说明


    前言

    本文主要用来记录使用CMake在编译代码时一些常用命令,及过程中注意的点。

    CMake官方使用教程文档

    CMake使用实例

    编译可执行程序

    # cmake的最低版本要求
    cmake_minimum_required(VERSION 3.8)
    
    # 工程名称和版本
    project(main VERSION 1.0)
    
    # 指定的C++编译器版本是必须的
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    # 指定为C++14 版本
    set(CMAKE_CXX_STANDARD 14)
    
    # 为特定程序指定编译属性
    set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY CXX_STANDARD 14)
    
    # 可以添加一个编译的子路径,在子路径中查找CMakeLists.txt文件,并进行编译
    # add_subdirectory(test)
    
    # 定义Include目录,方便后续建立依赖引用
    # 判断运行环境
    if(WIN32)
        set(Camport_DIR c:/camport3)
    elseif(UNIX)
        set(Camport_DIR /home/bing/camport3)
    endif()
    
    # 查找OpenCV包
    find_package(OpenCV)
    
    # 输出OpenCV相关信息到编译日志,debug使用(可删除此段)
    # STATUS:正常输出 WARNING:警告 FATAL_ERROR:异常
    message(STATUS "OpenCV:")
    message(STATUS "  version: ${OpenCV_VERSION}")
    message(STATUS "  libraries: ${OpenCV_LIBS}")
    message(STATUS "  include path: ${OpenCV_INCLUDE_DIRS}")
    
    # 指定包含文件
    file(GLOB SOURCE_FILES ${CMAKE_SOURCE_DIR}/*.cpp)
    
    # 指定编译文件名及编译可执行文件
    add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})
    
    # 对目标的外部库进行链接操作
    target_link_libraries (
            ${CMAKE_PROJECT_NAME}
            ${OpenCV_LIBS}
            ${Camport_DIR}/lib/linux/lib_x64/*.so
    )
    
    # 为指定项目添加 include 路径
    include_directories(${PROJECT_SOURCE_DIR}/include
                        ${Camport_DIR}/include
                        ${Camport_DIR}/sample
    )
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    编译动态库

    add_library: 为生成的库添加源文件,是库的名字,直接写名字即可,不要写lib,会自动加上前缀。 STATIC表示静态库(lib),SHARED表示动态库(so)

    add_library( [STATIC | SHARED | MODULE]
                [EXCLUDE_FROM_ALL]
                source1 [source2 ...])
    
    • 1
    • 2
    • 3

    CMakeLists.txt实例

    # cmake的最低版本要求
    cmake_minimum_required(VERSION 3.8)
    
    # 工程名称和版本
    project(main VERSION 1.0)
    
    # 指定的C++编译器版本是必须的
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    # 指定为C++14 版本
    set(CMAKE_CXX_STANDARD 14)
    
    # 为特定程序指定编译属性
    set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY CXX_STANDARD 14)
    
    # 定义Include目录,方便后续建立依赖引用
    # 判断运行环境
    if(WIN32)
        set(Camport_DIR c:/camport3)
    elseif(UNIX)
        set(Camport_DIR /home/bing/camport3)
    endif()
    
    # 查找OpenCV包
    find_package(OpenCV)
    
    # 输出OpenCV相关信息到编译日志,debug使用(可删除此段)
    message(STATUS "OpenCV:")
    message(STATUS "  version: ${OpenCV_VERSION}")
    message(STATUS "  libraries: ${OpenCV_LIBS}")
    message(STATUS "  include path: ${OpenCV_INCLUDE_DIRS}")
    
    # 指定包含文件
    file(GLOB SOURCE_FILES ${CMAKE_SOURCE_DIR}/*.cpp)
    
    # 指定编译动态库文件名及动态库类型
    add_library(${CMAKE_PROJECT_NAME} SHARED
    	${SOURCE_FILES}
    )
    
    # 对目标的外部库进行链接操作
    target_link_libraries (
            ${CMAKE_PROJECT_NAME}
            ${OpenCV_LIBS}
            ${Camport_DIR}/lib/linux/lib_x64/*.so
    )
    
    # 为指定项目添加 include 路径
    include_directories(${PROJECT_SOURCE_DIR}/include
                        ${Camport_DIR}/include
                        ${Camport_DIR}/sample
    )
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    CMake常用变量说明

    在外部指令中使用 ${} 进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过 ${} 取值。

    1. PROJECT_BINARY_DIR

    如果是in source编译,这个变量指得就是工程顶层目录,如果是out-of-source编译,指的是工程编译发生的目录。另外 _BINARY_DIRCMAKE_BINARY_DIR 跟这个变量指代的内容是一致的。

    1. PROJECT_SOURCE _DIR

    不论采用何种编译方式,都是工程顶层目录。也就是在in source编译时,他跟PROJECT_BINARY_DIR等变量一致。另外_SOURCE_DIRCMAKE_SOURCE_DIR跟这个变量指代的内容是一致的。

    1. CMAKE_CURRENT_SOURCE_DIR

    指的是当前处理的CMakeLists.txt所在的路径。

    1. CMAKE_CURRRENT_BINARY_DIR

    如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource编译,他指的是 target 编译目录。使用ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。

    1. CMAKE_CURRENT_LIST_FILE

    输出调用这个变量的CMakeLists.txt的完整路径。

    1. CMAKE_CURRENT_LIST_LINE

    输出这个变量所在的行。

    1. CMAKE_MODULE_PATH

    这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。比如
    SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
    这时候你就可以通过 INCLUDE 指令来调用自己的模块了。

    1. EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH

    前者用来重新定义目标二进制可执行文件的存放位置,后者用来重新定义目标链接库文件的存放位置。

    1. PROJECT_NAME

    返回通过 PROJECT 指令定义的当前项目名称。

    1. CMAKE_PROJECT_NAME
        project(A) 
        add_subdirectory(B) 
    
    • 1
    • 2

    返回根项目的项目名称,比如B项目是A项目的子项目,在B项目中获取CMAKE_PROJECT_NAME得到的结果是A,获取PROJECT_NAME得到的结果是B

  • 相关阅读:
    Android10及以上版本系统源码下载、编译、刷机、联网、问题解决的通用方案(Google Pixel3手机)
    基于C#制作一个桌面宠物
    SpringBoot-日志配置
    Linux内核源码分析 (B.11) 从内核世界透视 mmap 内存映射的本质(原理篇)
    element table表格树形数据展示
    Hi3861 OpenHarmony嵌入式应用入门--hello world
    150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备
    makefile规则查找
    Python 遍历字典的若干方法
    免费 AI 编程助手 Amazon CodeWhisperer 体验
  • 原文地址:https://blog.csdn.net/Bing_Lee/article/details/128199894