Linux中使用CMake导入第三方开发库

Linux中使用CMake导入第三方开发库

背景

一般CMake中导入第三方库主要使用如下三个方法:

  1. find_package
    主要使用场景是第三方库提供了CMake文件或是CMake官方适配了部分流行的开发库。
  2. FindPkgConfig
    主要使用场景是第三方库没有提供CMake文件,但是提供了pkg-config文件。
  3. FetchContent
    主要使用场景是从开发者网站获取最新源码或是制定版本的源码,并且这个开发库提供了CMake文件或是pkg-config文件。

上述三种场景,官方文档都有示例可以参考。今天主要记录下第三方开发库中没有提供CMake文件和pkg-config文件的情况下,如何使用CMake优雅的导入这个库。

add_library的imported用法

add_library 常用于生成静态或动态库,其实也可用于从外部导入第三方库。

add_library(<name> <type> IMPORTED [GLOBAL])

libyuv-dev为例,其在linux中的安装目录结构和文件如下,没有CMake文件或是pkg-config文件。

/.
/usr
/usr/include
/usr/include/libyuv
/usr/include/libyuv/basic_types.h
/usr/include/libyuv/compare.h
/usr/include/libyuv/compare_row.h
/usr/include/libyuv/convert.h
/usr/include/libyuv/convert_argb.h
/usr/include/libyuv/convert_from.h
/usr/include/libyuv/convert_from_argb.h
/usr/include/libyuv/cpu_id.h
/usr/include/libyuv/macros_msa.h
/usr/include/libyuv/mjpeg_decoder.h
/usr/include/libyuv/planar_functions.h
/usr/include/libyuv/rotate.h
/usr/include/libyuv/rotate_argb.h
/usr/include/libyuv/rotate_row.h
/usr/include/libyuv/row.h
/usr/include/libyuv/scale.h
/usr/include/libyuv/scale_argb.h
/usr/include/libyuv/scale_row.h
/usr/include/libyuv/scale_uv.h
/usr/include/libyuv/version.h
/usr/include/libyuv/video_common.h
/usr/include/libyuv.h
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libyuv.a
/usr/share
/usr/share/doc
/usr/share/doc/libyuv-dev
/usr/share/doc/libyuv-dev/copyright
/usr/lib/x86_64-linux-gnu/libyuv.so
/usr/share/doc/libyuv-dev/changelog.Debian.gz

我们可以在项目中新建一个名如third_part.cmake文件,使用add_library导入这个库。

add_library(libyuv SHARED IMPORTED GLOBAL)
set_target_properties(libyuv PROPERTIES IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libyuv.so"INCLUDE_DIRECTORIES "/usr/include/")

其中,add_library中的IMPORTED表示这个库文件是外部导入,不参与本项目的编译。set_target_properties中的IMPORTED_LOCATION指定这个库的so文件的路径,INCLUDE_DIRECTORIES指定库的头文件所在目录的路径。

整个项目的目录结构如下:

ubuntu-razer:~/CLionProjects/cmake_library_imported$ tree
.
├── cmake
│ └── third_part.cmake
├── CMakeLists.txt
└── main.cpp

项目根目录中CMakeList.txt可以如下方式引用libyuv。整体来看,项目结构简洁,可读性高。

cmake_minimum_required(VERSION 3.28)
project(cmake_library_imported)
set(CMAKE_CXX_STANDARD 20)
include(cmake/third_part.cmake)
add_executable(cmake_library_imported main.cpp)
target_link_libraries(cmake_library_imported PRIVATE libyuv)

参考文章

  1. https://cmake.org/cmake/help/latest/command/find_package.html
  2. https://cmake.org/cmake/help/latest/module/FindPkgConfig.html
  3. https://cmake.org/cmake/help/latest/module/FetchContent.html
  4. https://cmake.org/cmake/help/latest/command/add_library.html#add-library
  5. https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html#importing-libraries

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode刷题笔记3:链表基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录链表基础1部分的题目&#xff0c;主要题目包括&#xff1a; 203.移除链表元素707.设计链表206.反转链表 知识点 链表 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据…

HQL面试题练习 —— 取出累计值与1000差值最小的记录

题目来源&#xff1a;滴滴 目录 1 题目2 建表语句3 题解 1 题目 已知有表 t_cost_detail 包含 id 和 money 两列&#xff0c;id 为自增&#xff0c;请累加计算money 值&#xff0c;并求出累加值与 1000 差值最小的记录。 ------------- | id | money | ------------- | 1 …

LLM中的few-shot是什么意思

我上篇博客写了我做的测试Baichuan2-13B模型的一些工作&#xff0c;测试过程免不了要修改代码&#xff0c;在代码中接触了下所谓的few-shot。 比如&#xff0c;所谓2-shot&#xff0c;就是在提示词里提供两个问题和答案&#xff0c;让大模型以为自己回答过问题&#xff0c;后面…

vscode插件-03 PHP

PHP Intelephense 如果php在远程计算机上&#xff0c;要把插件安装在远程&#xff0c;而不是本地。 这个插件&#xff0c;要求php版本大于7&#xff0c;且设置环境变量&#xff08;好像不一定要设置&#xff09;。 设置里面搜索php.executablePath&#xff0c;打开setting.js…

vue-router路由懒加载以及三种实现方式

什么是路由懒加载&#xff1f; 延迟加载或按需加载路由所对应的组件&#xff0c;而不是在应用初始化时就一次性加载所有组件。 路由懒加载做了什么事情&#xff1f; 主要作用是将路由对应的组件打包成一个个的js代码块 只有在这个路由被访问到的时候&#xff0c;才加载对应…

Windows系统安装OpenSSH使用VScode远程连接内网Linux服务器开发

文章目录 &#x1f4a1;推荐 前言1、安装OpenSSH2、VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网…

【详细讲解】二叉树的层序遍历

广度优先搜索 总结一下&#xff0c;思路就是&#xff1a; 加入元素&#xff0c;记录size&#xff0c;size就是当前这一层的元素个数。不断弹出元素&#xff0c;size - 1&#xff0c; 同时加入弹出元素的左右孩子&#xff0c;直到size0&#xff0c;说明当前层已经完全遍历完&am…

解决vue版本不一致导致不能正常编译

解决vue版本不一致导致不能正常编译 异常现象分析原因解决方案 异常现象 项目原本运行无异常&#xff0c;但安装了一个el-table-infinite-scroll的插件后&#xff0c;编译报错&#xff0c;截图如下 分析原因 vue版本与compile版本不一致&#xff0c;应该统一起来&#xff0…

C++下的内存管理

文章目录 内存分布C语言中动态内存管理方法C内存管理new/delete操作内置类型new和delete操作自定义类型operator new 和 operator deletenew和delete的实现原理定位new表达式 malloc/free和new/delete的区别内存泄漏 内存分布 栈&#xff1a;又叫做堆栈–非静态局部变量/函数参…

算法学习笔记(5.1)-基于比较的高效排序算法(快速排序,堆排序)

##时间复杂度O(NlogN) 目录 ##时间复杂度O(NlogN) ##快速排序 ##原理 ##图例 ##代码实现 ##堆排序 ##原理 ##图例 ##代码实现 ##快速排序 ##原理 快速排序的核心操作是“哨兵划分”&#xff0c;其目标是&#xff1a;选择数组中的某个元素作为“基准数”&#xff0c;…

【编译原理复习笔记】语法分析(一)

分类 语法分析可以按照分析方向分为两类 自顶向下/自底向上 自顶向下的分析 从分析树的顶部向底部方向构造分析树 每一步推导需要做两个选择&#xff1a; &#xff08;1&#xff09;需要替换哪个非终结符 &#xff08;2&#xff09;用哪个产生式 最左推导 在最左推导中&am…

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

前言 大家好&#xff0c;今天是【重学C】系列的第二讲&#xff0c;我们来聊聊C的智能指针。 为什么需要智能指针 在上一讲《01 C如何进行内存资源管理》中&#xff0c;提到了对于堆上的内存资源&#xff0c;需要我们手动分配和释放。管理这些资源是个技术活&#xff0c;一不…

正点原子LWIP学习笔记(一)lwIP入门

lwIP入门 一、lwIP简介&#xff08;了解&#xff09;二、lwIP结构框图&#xff08;了解&#xff09;三、如何学习lwIP&#xff08;熟悉&#xff09; 一、lwIP简介&#xff08;了解&#xff09; lwIP是一个小型开源的TCP/IP协议栈 阉割的TCP/IP协议 TCP/IP协议栈结构&#xff0…

C语言游戏实战(12):植物大战僵尸(坤版)

植物大战僵尸 前言&#xff1a; 本游戏使用C语言和easyx图形库编写&#xff0c;通过这个项目我们可以深度的掌握C语言的各种语言特性和高级开发技巧&#xff0c;以及锻炼我们独立的项目开发能力&#xff0c; 在开始编写代码之前&#xff0c;我们需要先了解一下游戏的基本规则…

基础2 JAVA图形编程桌面:探索图形程序的抽象实现

嘿&#xff0c;大家好&#xff01;我非常高兴又一次有机会与大家相聚&#xff0c;分享新的知识和经验。对于热爱编程和探索新技术的朋友们来说&#xff0c;今天的内容绝对不容错过。我为大家准备了一个详尽的视频教程&#xff1a;《基础2 JAVA 图形编程&#xff1a;主程序调用…

【Python爬虫】Selenium使用

安装配置教程自行搜索 所用驱动chromedriver应与chrome浏览器版本相对应 pip install selenium 笔者selenium所用版本为4.11.2&#xff0c;新旧版之间会有差别 from selenium import webdriver driver webdriver.Chrome()实例化driver对象后&#xff0c;driver对象有一些常…

vue(十二) 组件二 动态组件(Component)和异步组件(defineAsyncComponent)

文章目录 组件注册1.全局注册2.局部注册3.组件名格式 动态组件异步组件1.基本使用2.加载与错误状态3.搭配Suspense 组件使用 组件注册 一个 Vue 组件在使用前需要先被“注册”&#xff0c;这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式&#xff1a;全局注册…

git拉取项目前需要操作哪些?

1.输入 $ ssh-keygen -t rsa -C "秘钥说明" 按enter键 2.出现 ssh/id_rsa&#xff1a;(输入也可以不输入也可以) 然后按enter键 3.出现empty for no passphrase&#xff1a;(输入也可以不输入也可以) 然后按enter键 4.出现same passphrase again: (输入也可以不输入也…

程序员如何减肥

目录 基本的生化知识减肥三板斧关于减肥药 基本的生化知识 人体供能顺序。是糖原——脂肪——蛋白质&#xff0c;只有先将肝糖原耗尽&#xff0c;机体才会动用脂肪。因为糖原分解靠的是三羧酸循环&#xff0c;脂肪分解靠的是脂肪动员和丙酮分解。如果一个人动用蛋白质来供能&a…

linux下直接使用别人的anaconda环境,copy别人环境

1.直接使用别人的anaconda安装环境 source /home/XXX/anaconda3/bin/activate conda activate labelme 2.copy anaconda环境 cp -r /home/XXX/anaconda3/envs/x-anylabeling /home/YYY/anaconda3/envs conda config --append envs_dirs /home/YYY/anaconda3/envs conda activa…