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

2023-09-22 13:55:37

我们在《【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:重新定义目标链接库文件的存放位置

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

3、主要开关选项

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

一、指定编译器

#使用默认的编译器
# 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++")

二、find_package 基本原理

2.1 如果不使用 find_package

1、#设置包括的头文件

include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/include
 )

2、设置搜索的库目录

link_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs
)

3、目标生成

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

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}  )

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

更多推荐

【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本

环境ubuntu20.04mongodb4.4.14还没实际使用(20230922)后续到10月底如果有问题会修改原理只会在有新增数据时生成新的备份日期目录备份恢复时,如果恢复的数据库未删除,则会覆盖数据准备准备一个文件夹,用于存放脚本增量备份脚本mongodb_incremental_backup.sh#!/bin/

综述 | 实时三维形状测量技术的综述

原创|文BFT机器人随着人工智能和机器人技术的快速发展,实时三维形状测量技术变得愈发重要。由于机器人通常在动态环境中操作,因此机器人装备的三维形状测量技术需要能够实时从运动的物体中获取三维形状信息。未来的三维机器视觉技术实际上依赖于实时三维数据获取和测量技术的发展。实时高精度的三维形状测量技术在医疗手术、生物医学工程、

项目经理的“四定、五起、六法”工作法

大家好,我是老原。说来,我也工作十多年了,就像很多刚入门的项目经理一样,一开始不知道怎么预设风险、沟通和团队协调不够好;有的人就可以规避风险,人际往来和团队管理都信手拈来,整个项目顺风顺水,没什么大的问题出现……你以为他一开始就能这么6?其实都是做了很多项目后总结出了一些实用又有效的方式方法。而这些方法对每个职场人其实

SENSORO 城市数字化服务平台入围2023《财富》中国最佳设计榜

9月20日,《财富》杂志2023中国最佳设计榜揭晓,SENSORO城市智能感知服务平台荣登榜单。“这是数字政务与数字城市的新尝试”,《财富》评价称。这也是今年软件/平台类目的唯一上榜。数十年前,设计还主要体现于产品美学;到了今天,设计已成为商业模式创新和社会变革的起点。《财富》中国最佳设计榜就试图寻找那些从人的真实需求

tensorflow的unet模型

importtensorflowastffromtensorflow.keras.layersimportInput,Conv2D,MaxPooling2D,Dropout,UpSampling2D,concatenate#定义U-Net模型defunet(input_size=(256,256,3)):inputs=

正则表达式

正则表达式参考文章@CUGGZ参考文章@轩陌声明一个正则表达式字面量声明constrex=/pattern/;构造函数声明constrex=newRegExp(pattern);匹配模式字符集合[]可以匹配中括号中包含的任意字符比如想要匹配btctletrex=/[bc]t/g;letstring="actionbat

SVN 和 GIT 命令对比

参考https://blog.csdn.net/justry_deng/article/details/82259470#TortoiseSVN打分支、合并分支、切换分支https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/#版本控

机器学习——奇异值分解(未完)

开坑,刚看完书,已经有些窒息了先把坑挖了,再慢慢填,避免自己划水跳过我爱线代,线代爱我,阿弥陀佛为什么要学奇异值分解?因为书本倒数第二章专门提到的,想必一定很重要,于是我上网查了一下奇异值分解的应用wow。。。很有用,增加了学习的动力奇异值分解的应用在机器学习中,奇异值分解,可以删除一些没什么作用的特征。具体是如何删除

JVM——6.字节码指令

这篇文章我们来学习一下字节码指令目录1.简介2.字节码与数据类型3.加载与存储指令4.运算指令5.类型转换指令6.对象创建于访问指令7.操作数栈管理指令8.控制转移指令9.方法调用与返回指令10.异常处理指令11.同步指令12.小结1.简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码)

在微信公众号怎么做电子优惠券功能

在微信公众号上,商家可以提供电子优惠券功能来吸引更多的消费者关注并参与,同时提高产品的知名度和销售额。下面是一篇关于如何在微信公众号上实现电子优惠券功能的文章,供您参考。一、了解电子优惠券的定义和优势电子优惠券是一种以电子形式发放的优惠凭证,商家通过微信公众号向消费者发放电子优惠券,消费者在购买指定商品或服务时使用,可

一遍关于vue基础语法上篇

目录一.插值1.1.文本1.2.html1.2.3.属性1.1.4.表达式演示效果:二.指令2.1.v-if/v-else-if/v-else2.2.v-show2.3.v-for2.4.v-bindv-onv-model2.5.动态参数演示效果:三.过滤器3.1.局部过滤器基本应用3.2.局部过滤器串行使用3.3.局

热文推荐