文档章节

CMake如何查找库路径(一)

shzwork
 shzwork
发布于 03/30 17:57
字数 666
阅读 252
收藏 0

CMake如何查找库路径(一)

如果你的代码使用了外部库(external libraries),并且你事先不知道这些库的头文件和库文件在当前平台的位置。那么适当的文件夹路径和库的搜索路径就应该被添加到编译命令中去。 
CMake 通过提供find_package命令来帮助你实现这点()。 
本文简要介绍如何在CMake工程中使用外部库,然后介绍如何写自己的find module。

Contents 
- 1. 使用外部库 
- 2. 使用CMake没有提供find module 的外部库 
- 3. package finding的工作机制 
- 4. 利用pkg-config 
- 5. 编写find modules 
- 6. 执行和缓存 
- 7. 常见bugs


1.使用外部库

CMake本身提供了很多常用库的module来帮助查找该库。使用命令cmake –help-module-list 
可以查看提供了哪些module,或者到module的存放路径下查看,在ubuntu Linux上的位置通常在/usr/share/cmake/Modules/下。


2.使用CMake本身没有提供module的外部库

假设你要使用LibXML++库,但是CMake没有提供该库的module。同时你发现网上有其他人提供了FindLibXML++.cmake。 
此时可以下载该文件并把它丢到CMake module路径下。

有组件的包(components)

有些库不是只有一个整体组成,可能包含多个依赖库和组件。一个明显的例子是Qt 库,包含组建QtOpenGL和QtXML。为了使用这些组建,使用如下命令

find_package(Qt COMPONENTS QtOpenGL QtXml REQUIRED)
  • 1

在包为可选项时可以省略关键词REQUIRED。这样就可以使用变量<PACKAGE>_<COMPONENTS>_FOUND,例如Qt_QtXml_FOUND,来检查对应组建是否被找到。


3.包查找的机制

find_package()命令会查找moudle目录下的Find <name>.cmake文件。

  • 首先,CMake查找${CMAKE_MODULE_PATH}里的所有文件夹。

  • 然后, CMake查找自己的module目录<CMAKE_ROOT>/share/cmake-x.y/Modules/.

如果找不到上述文件,CMake会查找<Name>Config.cmake或者<lower-case-name&gt-config.cmake文件,这些应该是由库来安装的。

前者叫做module mode后者叫做config module。不论是哪个mode被使用,如果一个package 被找到了,都会生成一系列的变量。 
<Name>_FOUND 
<Name>_INCLUDE_DIRS 或 <Name>_INCLUDES 
<Name>_LIBRARIES 或<Name>_LIBS 
<Name>_DEFINITIONS

所有这些变量都在Find <name>.cmake文件里替换

本文转载自:https://blog.csdn.net/ybh491707054/article/details/55003313

shzwork
粉丝 11
博文 651
码字总数 10405
作品 0
厦门
私信 提问
cmake 学习笔记(三)

接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用。 学习一下cmake的 finder。 finder是神马东西? 当编译一个需要使用第三方库的软件时,我们需要知道: 去哪儿找头...

晨曦之光
2012/05/08
197
0
cmake 学习笔记(二)

在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式。 这次应该简单看看语法和常用的命令了。 简单的语法 注释 命令语法 字符串列表 变量(字符串或字符串列表) set(Foo a b c) ...

晨曦之光
2012/05/08
362
0
《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE 《CMake实践》笔记二:INSTALL/CMAKEINSTALLPREFIX 《CMake实践》笔记三:构建静态库与动态库 及 如何使用外部共享库和头文件 五、静态...

shzwork
03/30
26
0
cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西。但靠这些知识还是不能看懂PySide使用CMakeLists文件,接下来继续学习...

晨曦之光
2012/05/08
265
0
使用cmake编译C语言项目时使用第三方库

关于cmake的安装,CMakeLists.txt的语法规则,CMakeLists.txt的各种配置选项等复杂而专业的知识,限于本人能力,这里不再说明 演示使用glibc2.0库 一 项目目录 laolang@laolang-Lenovo-G470:...

小代码2016
2015/08/12
5.7K
6

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部