分享

CMake文档

 键盘农夫 2019-10-30

原文: <https:///doc/t1VDCEn4O0>

命令参数

FIND_PACKAGE( <name> [version] [EXACT] [QUIET] [NO_MODULE] [ [ REQUIRED | COMPONENTS ] [ componets... ] ] )
version:需要一个版本号,给出这个参数而没有给出EXACT,那个就是找到和给出的这个版本号相互兼容就符合条件
EXACT:要求版本号必须和version给出的精确匹配。
QUIET:会禁掉查找的包没有被发现的警告信息。对应于Find<Name>.cmake模块里面的的NAME_FIND_QUIETLY变量。
NO_MODULE:给出该指令之后,cmake将直接跳过Module模式的查找,直接使用Config模式查找。查找模式详见下方
REQUIRED:该选项表示如果没有找到需要的包就会停止并且报错
COMPONENTS:在REQUIRED选项之后,或者如果没有指定REQUIRED选项但是指定了COMPONENTS选项,在COMPONENTS后面就可以列出一些与包相关部分组件的清单
搜索原理
Cmake可以支持很多外部内部的库,通过命令可以查看当前cmake支持的模块有哪些: cmake --help-module-list 。或者直接查看模块路径。Windosw的路径在cmak的安装目录:..\share\cmake-3.13\Modules
cmake本身是不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成
find_psckage的搜索模式:
Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件(XXX就是我们要搜索的库的名字),这个CMAKE_MODULE_PATH变量是cmake预先定义,但是没有值,我们一旦给这个变量赋值之后,cmake就会最高优先级的在这个变量里面去查找,没有找到就在自己的安装库里面去找有没有FindXXX.cmake模块,找到之后,执行该文件从而找到XXX库,其中具体查找库并给XXX_INCLUDE_DIR和XXX_LIBRARIES这两个变量赋值的操作有FindXXX.cmake模块完成
Config模式:如果Module模式没有找到,则启用Config模式查找,搜索XXX_DIR路径下的XXXConfig.cmake文件,执行该文件从而找到XXX库,其中查找库以及给XXX_INCLUDE_DIR和XXX_LIBRARY赋值的操作都是由XXXConfig.cmake模块完成
cmake默认采取的时Module模式,如果Module模式没有找到,才会使用Config模式查找,
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
version选项和EXACT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COMPONENTS选项,有些库不是一个整体比如Qt,其中还包含QtOpenGL和QtXml组件,当我们需要使用库的组件的时候,就使用COMPONENTS这个选项
find_package(Qt COMPONENTS QtOpenGL QtXml REQUIRED)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
找到之后给一些预定义的变量赋值
无论哪一种查找模式,只要找到包之后,就会给以下变量赋值:<NAME>_FOUND,<NAME>_INCLUDE_DIRS或者<NAME>_INCLUDES,<NAME>_LIBRARIES,<NAME>_DEFINITIONS。这些变量都在Find<NAME>.cmake文件中。
我们可以在CMakeLists.txt中使用<NAME>_FOUND变量来检测摆包是否被找到,
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
find_package的本质是执行一个.cmake文件,相当于cmake的内置的脚本,这个脚本将设置我们之前提到的相关的变量,相当于根据传进来的参数来使用一个查找模块,每一个常用的库在cmake里面就有一个对应的查找模块。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
find模块的编写流程:
首先使用:find_path和find_library查找模块的头文件以及库文件,然后将结果放到<NAME>_INCLUDE_DIR和<NAME>_LIBRARY里面
find_path():
find_path(<VAR> name1 [path1 path2 ...])
该命令搜索包含某个文件的路径,用于给定名字的文件所在路径,
一条名为:<VAR>的变量的Cache将会被创建。
如果在某个文件下面发现了该文件,路径就会被储存到变量里面,除非变量被清除,否则搜搜将不会进行。
如果没有发现该文件,<VAR>里面储存的就是<VAR>-NOTFOUND
find_library():
find_library(<VAR> name1 [path1 path2 ...])
查找一个库文件
设置:<NAME>_INCLUDE_DIRS为<NAME>_INCLUDE_DIR<dependency1>_INCLUDE_DIRS ...
设置 <name>_LIBRARIES 为 <name>_LIBRARY <dependency1>_LIBRARIES ...
调用宏 find_package_handle_standard_args() 设置 <name>_FOUND 并打印或失败信息
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我们以Cmake里面自带的bzip2库为例,Cmake的module目录里面有一个:FindBZip.cmake模块,我们使用find_package(BZip2),然后CMake就会给相关的变量赋值,我们就可以调用这个模块,就可以使用模块里面的变量,模块里面的变量有哪些,我们可以使用命令: cmake --help-module FindBZip2来查看,最后面的参数就是带上Find前缀之后的模块的名字。
假如一个程序需要使用BZip2库,编译器需要知道bzlib.h的位置,链接器需要知道bzip2库(动态链接:.so或者.dll)
添加库的指令:find_package(BZip2 REQUIRED)
CMake里面又很多内置的库,当我们使用find_package查找包的时候CMake首先会去CMAKE_MODULE_PATH这个变量存放的路径里面去寻找
注意:CMAKE_MODULE_PATH的路径设置需要在顶层的CMakeLists.txt里面去设置。
find_package之后,变量:BZIP_INCLUDE_DIRS以及BZIP2_LIBRARIES就会被设置,然后我们使用include_directories以及target_link_libraries来使用即可
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
使用一个cmake里面没有带的库
cmake的/share/cmake-X.XX/Modules里面带的都是一些常用的库,如果我们现在需要使用一个cmake里面没有提供给我们find模块的库,做法如下:
首先模拟生成一个生成lib文件
创建工程,名为:ThirdLIB
生成一个lib文件,名为:ThirdDLL.lib
lib文件里面只提供了一个求和的add函数,返回两个int值的和
在CMakeLists.txt里面设置CMAKE_MODULE_PATH,这里设置的是本地的路径,这个路径存放的find模块
编写自己的find模块
注意:cmake使用find_package查找使用的库,当我们把库名字传进去之后,cmake会在按照指定的模式查找一个:Find<NAME>.cmake的文件,常用的库,cmake都会提供对应的.cmake文件,但是现在我们使用的是自己编写的库,所以cmake是没有提供的,需要自己编写
编写大致流程已经给出,我们编写的文件名必须是:Find<Name>.cmake,现在就是“FindThidrDLL.cmake”
FindThirDLL.cmake内容如下
修改CMakeLists.txt文件,在里面使用find_package命令添加模块、
完成之后,打开生成的工程,查看工程的依赖项,就会有ThirdLIB.lib的选项
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当我们在CMake里面使用一个库时候,如何在网上查找,比如现在需要查找:apr库,在goole里面搜索:find package apr cmake,就可以直接找到对应的CMake脚本。然后复制粘贴,创建.cmake文件,放在工程根目录下面的modules目录,没有则创建之
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

搜索

复制

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多