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

        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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AlphaMissense:预测错义变异的致病性

错义变异或错义变体(missense variation或missense variants)是改变蛋白质氨基酸序列的遗传变异。致病性错义变异会严重破坏蛋白质功能,在目前观察到的400多万个错义变异中,只有2%在临床上被确定为致病或良性。对剩下的类型不明的…

关于使用绿联 USB-A转RJ45 2.5G网卡提速的解决问题

问题 网络下载速率低 我的自带网卡是 I219v 在嵌入了2.5G网络后一直无法到达1.5G以上。 平均测速300~500M 解决方案 更新了USB的网卡驱动 禁用了 I219-V的驱动。测速即可 USB下载地址 https://download.csdn.net/download/qq_28198181/89468806

基于SpringBoot+Vue二手交易平台设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

银河麒麟V10安装docker和docker-compose

1. 说明 系统镜像使用的是Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso如果是在VMware中安装这个系统,需选择Ubuntu,如果选Centos会有问题。 尝试使用在线方式安装docker,报了很多错误,比较麻烦,建议使用离…

Kubernetes集群UI及主机资源监控

Kubernetes集群UI及主机资源监控 1. Kubernetes dashboard作用 通过dashboard能够直观了解Kubernetes集群中运行的资源对象,可以直接管理(创建、删除、重启等操作)资源对象 2. 获取Kubernetes dashboard资源清单文件 下载kubernetes-dashboard配置文件cd /data/k8s-work wg…

【CV炼丹师勇闯力扣训练营 Day13:§6二叉树1】

CV炼丹师勇闯力扣训练营 代码随想录算法训练营第13天 二叉树的递归遍历 二叉树的迭代遍历、统一迭代 二叉树的层序遍历 一、二叉树的递归遍历(深度优先搜索) 【递归步骤】 1.确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理…

【仿真建模-anylogic】Network代码解析

Author:赵志乾 Date:2024-06-22 Declaration:All Right Reserved!!! 1. 类图 2. 代码解析 //************************核心字段************************* // Network所属的level private transient Leve…

FFmpeg+javacpp+javacv使用

FFmpegjavacppjavacv使用 Bytedeco官网案例1、导入opencv、ffmpeg依赖包2、FFmpeg 数据结构2.1 AVFormatContext 格式化I/O上下文2.1.1 metadata2.1.2 Duration、start、bitrate等其他信息2.1.3 dump信息 Bytedeco GitHub:javacpp Bytedeco官网案例 FFmpeg – [示例…

Flutter图像编辑器应用:创造生动美丽的照片体验

介绍 引言 想象一下,在一个阳光明媚的下午,与家人或朋友漫步在风景如画的街道上。拿出手机,迫不及待地捕捉这一刻的美好,按下快门,留下了一张充满回忆的照片。 然而,回到家后发现照片的亮度有些偏暗&…

【机器学习】正则卷积群理论及Python代码实现

1. 引言 1.1.卷积神经网络CNN 卷积神经网络(CNN)的数学模型是深度学习中用于处理图像和其他高维数据的关键组成部分。那么,CNN究竟是什么呢? 总结起来,CNN网络主要完成以下操作: 卷积操作(Co…

Android记录3--ExpandableListView使用+获取SIM卡状态信息

布局文件&#xff1a; /SIM_Card_Demo/res/layout/inbox.xml <LinearLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools“http://schemas.android.com/tools” android:layout_width“match_parent” android:layout_height“match_par…

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镜像 三、在宿主机创建目录四、启…

Python爬虫基础以及示例讲解

爬虫简介 网络爬虫 爬虫指在使用程序模拟浏览器向服务端发出网络请求&#xff0c;以便获取服务端返回的内容。 但这些内容可能涉及到一些机密信息&#xff0c;所以爬虫领域目前来讲是属于灰色领域&#xff0c;切勿违法犯罪。 爬虫本身作为一门技术没有任何问题&#xff0c;关…

【FreeRTOS】创建任务_使用任务参数

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 文章目录 前言编写任务函数创建任务任务保护措施写了个bug疑问遗留问题效果freertos.c 学习链接 前言 配套源码&#xff1a;06_create_task_use_params 我们创建3个任务&#xff0c;使用同一个函数&#xff0c;但是在L…

Master PDF Editor v5 解锁版安装教程(小巧多功能PDF )

前言 Master PDF Editor&#xff0c;小巧的多功能PDF编辑器&#xff0c;轻松查看&#xff0c;创建&#xff0c;修改&#xff0c;批注&#xff0c;签名&#xff0c;扫描&#xff0c;OCR和打印PDF文档。高级注释工具&#xff0c;可以添加任意便笺指示对象突出显示&#xff0c;加…

c++中从父类继承的属性在子类内存中如何显示?

目录 一、继承概念 二、示例 三、结论 一、继承概念 在C中&#xff0c;继承是面向对象编程的一个重要特性&#xff0c;它允许一个类&#xff08;称为派生类或子类&#xff09;继承另一个类&#xff08;称为基类或父类&#xff09;的成员&#xff08;包括数据成员和成员函数…

数据结构:为什么说链表是顺序表的升级版(c语言实现)

前言&#xff1a; 我们在之前的几篇文章中详细的讲解了顺序表的特点&#xff0c;增删改查操作和动态顺序表的优点&#xff0c;并使用顺序表的底层结构实现了通讯录项目&#xff0c;似乎顺序表是一个非常完美的数据结构&#xff0c;它可以实现按照需求实现增删查改&#xff0c;对…

由于bug造成truncate table卡住问题

客户反应truncate table卡主&#xff0c;检查awr发现多个truncate在awr报告期内一直没执行完&#xff0c;如下&#xff1a; 检查ash&#xff0c;truncate table表的等待事件都是“enq: RO - fast object reuse”和“local write wait” 查找“enq: RO - fast object reuse”&am…

2024年能源电力行业CRM研究报告

中国能源电力行业属于大制造业的重要组成部分&#xff0c;在国民经济中的地位举足轻重。据统计&#xff0c;近十年来能源电力行业的整体投资呈现出增长趋势&#xff0c;尤其是“十四五”期间增长显著&#xff0c;2022年全国主要电力企业共完成投资12470亿元&#xff0c;同比增长…

Nuxt3 [Vue warn]: Hydration node mismatch:【解决方案】

[Vue warn]: Hydration node mismatch: 水合节点不匹配 Server rendered element contains more child nodes than client vdom. 服务器呈现的元素包含的子节点多于客户端vdom。 这个问题解决起来也很好解决&#xff0c;看这个问题是怎么出来的&#xff0c;看代码&#xff1a;…