在Linux下使用CMake加载自定义路径第三方库的指南

news2025/1/11 0:05:00

        CMake是一个强大的跨平台构建系统,广泛应用于C++项目中。它不仅能够处理标准的构建过程,还可以灵活地集成各种第三方库,包括自定义路径的库、已编译的共享库(.so 文件),以及仅包含头文件的库(如Eigen)。在这篇博客中,我们将探讨如何在Linux环境下使用CMake加载这些不同类型的第三方库。

1. 加载自定义路径的第三方库

        有时需要使用位于自定义路径的第三方库。这种情况下,我们可以使用CMake的find_package命令和一些配置选项来指定库的位置。

        假设有一个名为MyLib的库,位于/opt/mylib路径下。

示例代码
# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(MyProject)

# 设置自定义路径
set(MYLIB_ROOT /opt/mylib)

# 指定库和包含路径
include_directories(${MYLIB_ROOT}/include)
link_directories(${MYLIB_ROOT}/lib)

# 查找并链接MyLib库
find_library(MYLIB_LIB NAMES mylib PATHS ${MYLIB_ROOT}/lib)

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 链接MyLib库
target_link_libraries(MyExecutable ${MYLIB_LIB})

        在这个例子中,首先设置了MYLIB_ROOT变量来存储库的路径。然后,我们使用include_directorieslink_directories指令来指定头文件和库文件的位置。find_library命令用于查找并保存库的路径,最后在target_link_libraries中链接库。

2. 加载已编译的共享库(.so文件)

        加载预编译的共享库与自定义路径的库类似。主要的不同在于,我们可以直接使用共享库的路径进行链接,而不必查找库的位置。

        假设有一个共享库libshared.so,位于/usr/local/lib

示例代码
# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(MyProject)

# 指定共享库的路径
set(SHARED_LIB_PATH /usr/local/lib/libshared.so)

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 链接共享库
target_link_libraries(MyExecutable ${SHARED_LIB_PATH})

        在这个例子中,我们直接使用共享库的路径进行链接,而无需查找库的路径。

3. 加载只有头文件的库(如Eigen)

        Eigen是一个只有头文件的C++库,因此我们不需要链接任何库文件,只需指定包含目录即可。

        假设我们已经下载了Eigen库并将其解压到/opt/eigen目录下。

示例代码

# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(MyProject)

# 指定Eigen的包含路径
include_directories(/opt/eigen)

# 添加可执行文件
add_executable(MyExecutable main.cpp)

        在这个例子中,我们只需要使用include_directories指令来指定Eigen头文件的位置。这样,当我们在main.cpp中包含Eigen的头文件时,编译器就能够找到它们。

4. 结合多个库

        在实际项目中,我们通常需要同时加载多个库,包括不同类型的库。我们可以将以上的方法组合在一起,以支持复杂的依赖关系。

综合示例

        假设我们有以下依赖:

  • MyLib,位于自定义路径/opt/mylib
  • 共享库libshared.so,位于/usr/local/lib
  • 头文件库Eigen,位于/opt/eigen

        我们可以通过以下CMake脚本来整合这些库:

# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(MyComplexProject)

# 指定自定义路径的MyLib
set(MYLIB_ROOT /opt/mylib)
include_directories(${MYLIB_ROOT}/include)
find_library(MYLIB_LIB NAMES mylib PATHS ${MYLIB_ROOT}/lib)

# 指定共享库的路径
set(SHARED_LIB_PATH /usr/local/lib/libshared.so)

# 指定Eigen的包含路径
include_directories(/opt/eigen)

# 添加可执行文件
add_executable(MyExecutable main.cpp)

# 链接MyLib和共享库
target_link_libraries(MyExecutable ${MYLIB_LIB} ${SHARED_LIB_PATH})

        这个脚本整合了多个库类型,通过include_directoriesfind_library来处理头文件库和共享库的加载和链接。

总结

        在Linux下使用CMake加载第三方库的灵活性使得它成为管理项目依赖的强大工具。无论是指定自定义路径的库、加载共享库,还是处理仅包含头文件的库,CMake都提供了简便的方法。

参考文档

  • CMake Documentation
  • Using CMake to Build Applications

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

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

相关文章

qt 简单实验创建一个可以拖拽和缩放的矩形

1.概要 2.代码 2.1 resizablewidget.h #ifndef RESIZABLEWIDGET_H #define RESIZABLEWIDGET_H#include <QWidget> #include <QMouseEvent>class ResizableWidget: public QWidget {Q_OBJECT public:ResizableWidget(QWidget *parent nullptr); protected:void m…

IPD笔记

IPD笔记 先弄一个一图流&#xff0c;改天再过来继续补充 IPD&#xff08;Integrated Product Development&#xff09;即集成产品开发&#xff0c;是一套产品开发的模式、理念与方法。华为的IPD的核心思想是基于市场需求&#xff0c;将产品开发作为一项投资来管理&#xff0c;以…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】卷积

卷积经常用在信号处理中&#xff0c;用于计算信号的延迟累积。假设一个信号发射器每个时刻 t t t产生一个信号 x t x_t xt​&#xff0c;其信息的衰减率为 w k w_k wk​&#xff0c;即在 k − 1 k-1 k−1个时间步长后&#xff0c;信息为原来的 w k w_k wk​倍&#xff0c;时刻 …

vivado、vitis2022安装及其注意事项(省时、省空间)

1、下载 AMD官网-资源与支持-vivado ML开发者工具&#xff0c;或者vitis平台&#xff0c; 下载的时候有个官网推荐web安装&#xff0c;亲测这个耗时非常久&#xff0c;不建议使用&#xff0c;还是直接下载89G的安装包快。 注意&#xff1a;安装vitis平台会默认安装vivado&…

速卖通测评成本低见效快,自养号测评的实操指南,快速积累销量和好评

对于初入速卖通的新卖家而言&#xff0c;销量和评价的积累显得尤为关键。由于新店铺往往难以获得平台活动的青睐&#xff0c;因此流量的获取成为了一大挑战。在这样的背景下&#xff0c;进行产品测评以积累正面的用户反馈和销售记录&#xff0c;成为了提升店铺信誉和吸引潜在顾…

Mybatis框架的缓存

Mybatis框架的缓存 一.为什么使用缓存 缓存(cache&#xff09;的作用是为了减去数据库的压力&#xff0c;提高查询性能。缓存实现的 原理是从数据库中查询出来的对象在使用完后不要销毁&#xff0c;而是存储在内存&#xff08;缓存&#xff09; 中&#xff0c;当再次需要获取…

算法设计与分析:动态规划法求扔鸡蛋问题 C++

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想和实验结果 1、动态规划法原理&#xff1a; 2、解决方法&#xff1a; 2.1 方法一&#xff1a;常规动态规划 2.1.1 算法思想&#xff1a; 2.1.2 时间复杂度分析 2.1.3 时间效率分析 2.2 方法二&#xff1a;动态规划加…

Excel导出实例

在上一节的基础上&#xff0c;本文演示下如何导出excel数据。 Excel导出操作演示 继承ocean-easyexcel SDK <dependency><groupId>com.angel.ocean</groupId><artifactId>ocean-easyexcel</artifactId><version>1.0.0</version> …

标准立项 | 《温室气体排放核算与报告要求 废油资源化企业》

《温室气体排放核算与报告要求 废油资源化企业》适用于废油资源化行业企业温室气体排放量的核算和报告。从事废油资源化生产的企业&#xff0c;均可参考该标准核算企业的温室气体排放量&#xff0c;并编制企业温室气体排放报告。 参编咨询&#xff1a;中华环保联合会水环境治理…

【Deep Learning】Self-Supervised Learning:自监督学习

自监督学习 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写&#xff0c;既是课堂笔记&#xff0c;亦是作者的一些理解。 在深度学习领域&#xff0c;传统的监督学习(Supervised Learning)的形式是给你输入 x x x和标签 y y y&#xff0c;你需要训…

电商平台生活用品销售数据分析与应用

摘 要 在当前互联网飞速发展的时代&#xff0c;计算机应用给我们的工作生活带来了极大的便利。如今我们的生活离不开电商平台&#xff0c;其随之而来的是各种各样的销售数据与消费者信息&#xff0c;这些数据和信息的分析应用成为了当前互联网领域研究的重要部分。 本论文以基…

【JavaEE】Cookie和Session详解

一.Cookie 首先我们知道HTTP协议本身是’‘无状态’‘的, 这里的’‘无状态’指的是:默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的联系. 但是在实际的开发过程之中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后,第二次访…

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1&#xff1a;访问负索引示例2&#xff1a;访问超出上限的索引示例3&#xff1a;循环边界…

C# 实现draw一个简单的温度计

运行结果 概述&#xff1a; 代码分析 该控件主要包含以下几个部分&#xff1a; 属性定义&#xff1a; MinValue&#xff1a;最低温度值。 MaxValue&#xff1a;最高温度值。 CurrentValue&#xff1a;当前温度值。 构造函数&#xff1a; 设置了一些控件样式来提升绘制效果…

使用Spring Boot构建RESTful API:从理论到实践

文章目录 引言第一章 RESTful API基础知识1.1 什么是RESTful API1.2 RESTful API的优势 第二章 Spring Boot基础知识2.1 什么是Spring Boot2.2 Spring Boot的主要特性 第三章 使用Spring Boot构建RESTful API3.1 项目初始化3.2 构建基础结构3.3 定义实体类3.4 创建Repository接…

Android低版本上APP首次启动时间减少80%(二)

06-25 15:10:53.821 7449 7450 D dalvikvm: threadid2: sending two SIGSTKFLTs to threadid135 (tid8021) to cause debuggerd dump SIGSTKFLT 是 Dalvik 虚拟机特有的一个信号。当虚拟机发生了 ANR 或者需要做 GC 的时候&#xff0c;就需要挂起所有 RUNNING 状态的线程&…

FPGA国内”薪“赛道-在医疗领域的应用

mian 免 ze 责 sheng 声 ming 明 以下观点仅代表个人观点&#xff0c;不代表任何公司或者行业 从下游应用市场来看&#xff0c;通信和工业市场份额位居FPGA芯片一二位&#xff0c;同时通信市场份额有望持续提升。但是目前通信和工业市场趋于稳定&#xff0c;FPGA厂商一直推AI市…

Docker部署Nginx1.21.5(保姆级图文教程)

系列文章目录 Docker部署Nginx1.21.5&#xff08;保姆级图文教程&#xff09; Docker部署MySQL8.3.0&#xff08;保姆级图文教程&#xff09; 文章目录 一、环境二、拉取镜像2.1 查找 Docker Hub 上的 nginx 镜像2.2 拉取Nginx镜像2.3 查看Nginx镜像 三、在宿主机创建目录四、启…

深度分析:地缘风险对出口的影响

核心观点 5月以来&#xff0c;CCFI运价涨幅显著扩大。除外需回暖外&#xff0c;集运“涨价”还有哪些催化因素&#xff0c;或如何影响后续出口&#xff1f; 一问&#xff1a;装箱航线运价大幅上涨背后&#xff1f;5月以来运价明显上涨&#xff0c;与外需复苏、出口改善相互印证…

架构设计 - 网站性能优化之静态资源CDN配置

摘要: web 应用业务缓存通常3级: 一级缓存:JVM 本地缓存 二级缓存:Redis集中式缓存 三级缓存:Nginx Proxy Cache 缓存 或 Nginx Lua 缓存 四级缓存:静态资源CDN缓存 页面静态化 本文主要分享 怎样通过CDN缓存静态资源的方式 提高系统性能和响应速度。 WEB应用通过CD…