• 【cmake开发(6)】Cmakelists 使用 gcc/g++指定版本,find_package 基本原理


    我们在《【cmake开发(5)】cmake 设置常规变量、环境变量、内置变量;cmake 带参数编译和 -D 选项; c++源码通过-D 选项的宏定义进行条件编译》 中提到了变量。

    回顾

    1、预定义变量

    PROJECT_SOURCE_DIR:工程的根目录
    PROJECT_BINARY_DIR:运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build
    PROJECT_NAME:返回通过 project 命令定义的项目名称
    CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
    CMAKE_CURRENT_BINARY_DIR:target 编译目录
    CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径
    CMAKE_CURRENT_LIST_LINE:当前所在的行
    CMAKE_MODULE_PATH:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
    EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
    LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、系统信息

    CMAKE_MAJOR_VERSION:cmake 主版本号,比如 3.4.1 中的 3
    ­CMAKE_MINOR_VERSION:cmake 次版本号,比如 3.4.1 中的 4
    ­CMAKE_PATCH_VERSION:cmake 补丁等级,比如 3.4.1 中的 1
    ­CMAKE_SYSTEM:系统名称,比如 Linux-­2.6.22
    ­CMAKE_SYSTEM_NAME:不包含版本的系统名,比如 Linux
    ­CMAKE_SYSTEM_VERSION:系统版本,比如 2.6.22
    ­CMAKE_SYSTEM_PROCESSOR:处理器名称,比如 i686
    ­UNIX:在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin
    ­WIN32:在所有的 win32 平台下该值为 TRUE,包括 cygwin
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、主要开关选项

    BUILD_SHARED_LIBS:这个开关用来控制默认的库编译方式,如果不进行设置,使用 add_library 又没有指定库类型的情况下,默认编译生成的库都是静态库。如果 set(BUILD_SHARED_LIBS ON) 后,默认生成的为动态库
    CMAKE_C_FLAGS:设置 C 编译选项,也可以通过指令 add_definitions() 添加
    CMAKE_CXX_FLAGS:设置 C++ 编译选项,也可以通过指令 add_definitions() 添加
    
    • 1
    • 2
    • 3

    一、指定编译器

    #使用默认的编译器
    # SET(CMAKE_C_COMPILER "gcc")
    # SET(CMAKE_CXX_COMPILER "g++")
    
    #使用指定的编译器
    # SET(CMAKE_C_COMPILER "/usr/local/bin/gcc")
    # SET(CMAKE_CXX_COMPILER "/usr/local/bin/g++")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、find_package 基本原理

    2.1 如果不使用 find_package

    1、#设置包括的头文件

    include_directories(
            ${CMAKE_CURRENT_SOURCE_DIR}
            ${CMAKE_CURRENT_BINARY_DIR}
            ${CMAKE_CURRENT_SOURCE_DIR}/include
     )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、设置搜索的库目录

    link_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/libs
    )
    
    • 1
    • 2
    • 3

    3、目标生成

    target_link_libraries( demo
                           # 目标库需要链接的库
                           ${log-lib} )
    
    • 1
    • 2
    • 3

    2.2 如果使用 find_package

    1、find_package( OpenCV REQUIRED ) 函数,如果找到了相关的头文件和库文件,则会相应保存在OpenCV_INCLUDE_DIRS 和OpenCV_LIBRARIES (OpenCV_LIBS) 中。
    2、include_directories( ${OpenCV_INCLUDE_DIRS} )
    3、目标生成

    target_link_libraries( joinMap ${OpenCV_LIBS}  )
    
    • 1

    Cmake中一个自动寻找函数find_package()可以帮我们实现这个功能。

    2.3 find_package原理

    首先,cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成,比如FindXXX.cmakeXXXConfig.cmake。只不过,库的作者通常会提供这两个文件,以方便使用者调用。

    find_package采用两种模式搜索库:

    • Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成(先搜索当前项目里面的Module文件夹里面提供的FindXXX.cmake,然后再搜索系统路径/usr/local/share/cmake-x.y/Modules/FindXXX.cmake)
    • Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件,执行该文件从而找到XXX库。其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。

    2.4 可以直接 include(mycmake/xxx.cmake)

    直接include 也可以实现find的功能。

    参考

    https://blog.csdn.net/afei__/article/details/81201039
    https://blog.csdn.net/sen873591769/article/details/90183015

  • 相关阅读:
    技术杂记:nginx进程的view和kill / linux命令
    adb使用笔记
    数据结构-------单链表
    C语言家政服务系统
    上周热点回顾(4.3-4.9)
    53. 最大子数组和
    Java多线程/线程池
    JavaScript中的闭包
    ES6面试题
    1539. 第 k 个缺失的正整数
  • 原文地址:https://blog.csdn.net/djfjkj52/article/details/124645519