文档章节

(小记)cmake:三

follitude
 follitude
发布于 2017/05/25 14:28
字数 563
阅读 1
收藏 0
点赞 0
评论 0

学习一下cmake的 finder。

finder是神马东西?

当编译一个需要使用第三方库的软件时,我们需要知道:

去哪儿找头文件 .h

对比GCC的 -I 参数

去哪儿找库文件 (.so/.dll/.lib/.dylib/...)

对比GCC的 -L 参数

需要链接的库文件的名字

对比GCC的 -l 参数

这也是一个 finder 需要返回的最基本的信息。

如何使用?

比如说,我们需要一个第三方库 curl,那么我们的 CMakeLists.txt 需要指定头文件目录,和库文件,类似:

include_directiories(/usr/include)
target_link_libraries(myprogram curl)

如果借助于cmake提供的finder会怎么样呢?使用cmake的Modules目录下的FindCURL.cmake,相应的 CMakeList.txt 文件:

find_package(CURL REQUIRED)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})

或者

find_package(CURL)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR "curl not found!")
endif(CURL_FOUND)

如果我们使用的finder,不是cmake自带的怎么办?

  • 放置位置:工程根目录下的 cmake/Modules/
  • 然后在 CMakeList.txt 中添加
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

find_package如何工作

find_package 将会在module路径下查找 Find<name>.cmake。首先它搜索 ${CMAKE_MODULE_PATH}中的所有路径,然后搜索 <CMAKE_ROOT>/share/cmake-x.y/Modules/

如果这个文件未找到,它将会查找 <Name>Config.cmake 或 <lower-case-name>-config.cmake 文件。这两个文件是库文件安装时自己安装的,将自己的路径硬编码到其中。

前者称为 module 模式,后者称为 config 模式

每个模块一般都会提供一下几个变量

  • <name>_FOUND

  • <name>_INCLUDE_DIR 或 <name>_INCLUDES

  • <name>_LIBRARY 或 <name>_LIBRARIES 或 <name>_LIBS

  • <name>_DEFINITIONS

编写finder

  • 首先使用 find_package 探测本软件包依赖的第三方库(参数 QUIETLY 和 REQUIRED应该被传递)
  • 如果 pkg-config 可用,则可以用其去探测include/library路径
  • 分别使用 find_path 和 find_library 查找头文件和库文件
    • pkg-config 提供的路径仅作为参考
    • CMake 有很多硬编码的路径
    • 结果放到 <name>_INCLUDE_DIR 和 <name>_LIBRARY (注意:单数而不是复数)

  • 设置 <name>_INCLUDE_DIRS 为 <name>_INCLUDE_DIR <dependency1>_INCLUDE_DIRS ...

  • 设置 <name>_LIBRARIES 为 <name>_LIBRARY <dependency1>_LIBRARIES ...

    • 依赖使用复数,包自身使用单数形式(由find_path和find_library提供)
  • 调用宏 find_package_handle_standard_args() 设置 <name>_FOUND 并打印或失败信息

参考

本文转载自:http://blog.csdn.net/dbzhang800/article/details/6329314

共有 人打赏支持
follitude
粉丝 4
博文 118
码字总数 4956
作品 0
浦东
part01_Linux下使用Cmake构建工程

一、安装Cmake 1.下载cmake-3.11.1.tar.gz:https://cmake.org/download/ 2.把 cmake-3.11.1.tar.gz放到任意临时目录(Cmake默认安装在:/usr/local/中),查看其权限如果没有权限直接更改权限...

IT魔幻师 ⋅ 05/09 ⋅ 0

Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

Could NOT find OpenSSL解决方案

Call Stack (most recent call first): CMakeLists.txt:122 (find_package) CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.2/Modules/FindPackageHandleStandardArgs.cmake:13......

fengyuzaitu ⋅ 06/20 ⋅ 0

Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之一

零、环境准备: 编译环境:Ubuntu-14.04 交叉编译工具链:arm-linux-gnueabi-4.5.1 目标机器:粤嵌GEC210开发板S5PV210(Cortex-a8) opencv库:opencv-3.2.0(源码),解压至某一目录 open...

qq_30155503 ⋅ 04/18 ⋅ 0

OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行

软件环境 Windows-10-64bit Qt-5.9.3 MinGW-5.3.0-32bit CMake-3.9.2 OpenCV-3.3.1 / 3.4.1(适用) 编译好的 OpenCV(MinGW 版): Github . huihut/OpenCV-MinGW-Build OpenCV 的 MSVC 版及 ......

数据为王 ⋅ 05/21 ⋅ 0

自动化构建系统 CMake 3.11.4 发布,常规维护版本

CMake 3.11.4 已发布,CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 ...

达尔文 ⋅ 06/15 ⋅ 1

在eclipse中使用cmake

环境:MAC OS X 11 (使用Linux应该也一样) eclipse版本: Oxygen.3a Release (4.7.3a) cmake版本: 3.11 笔者使用的方法是通过插件 cmake4eclipse 可以在下面地址找到 https://github.com/15k...

街角的小丑 ⋅ 05/07 ⋅ 0

CentOS6.5 安装cmake失败

安装cmake3.10.3的时,执行./bootstrap报错: Log of errors: /usr/local/src/cmake-3.10.3/Bootstrap.cmk/cmake_bootstrap.log 自己查了下 ,网上都说是缺少gcc 但是我已经安装过gcc和gcc-c...

最爱大裤衩 ⋅ 04/21 ⋅ 0

AndroidStudio3.0NDK输出多个so库

个人博客地址 http://dandanlove.com/ 前言 去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,...

静默加载 ⋅ 04/12 ⋅ 0

10km/feature_se

feature_se(feature search engine) (人脸)特征内存搜索引擎(feature search engine),提供高速的人脸特征相似度比对搜索/排序,支持多线程并行搜索,适用于百万级以上人脸库的快速搜索。(C+...

10km ⋅ 04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 58分钟前 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部