ubuntu cmake CPack将第三方库进行打包

news2024/11/18 7:46:04

有时需要将程序在其他电脑上执行,需要将第三方库同时进行打包,这里以opencv+pcl为例,使用CPack进行打包

工程文件结构

project/
├── CMakeLists.txt        # CMake构建脚本
├── src        						# 源文件
	├── main.cpp          # 主程序文件
└── copy_libs.sh          	# 脚本,用于收集依赖库
└── build         		 			# 编译文件夹
	└── libs          			# 第三方动态库

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(project)							# 工程名

# 工程编译优化
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wstack-protector")

# 查找OpenCV库
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

# 查找PCL库
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

# 添加可执行文件
add_executable(project src/main.cpp)

# 链接OpenCV和PCL库
target_link_libraries(project ${OpenCV_LIBS} ${PCL_LIBRARIES})

# 设置RPATH,以便运行时从/opt/install/lib目录中找到依赖库
set(CMAKE_INSTALL_RPATH "/opt/install/lib")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)

# 指定安装目录为/opt/install
set(CMAKE_INSTALL_PREFIX "/opt/install")

# 安装可执行文件到/opt/install/bin目录
install(TARGETS project DESTINATION bin)

# 安装libs目录下的动态库到/opt/install/lib目录
install(DIRECTORY ${CMAKE_BINARY_DIR}/libs/ DESTINATION lib)

# 设置CPack变量,打包deb文件
set(CPACK_GENERATOR "ZIP")              # DEB
set(CPACK_PACKAGE_NAME "project")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_CONTACT "your_email@example.com")
set(CPACK_PACKAGE_DESCRIPTION "这是一个包含OpenCV和PCL依赖库的示例项目")
set(CPACK_PACKAGE_MAINTAINER "您的姓名")
# 设置.deb包的安装前缀
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/install")
include(CPack)

main.cpp

#include <opencv2/opencv.hpp>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <iostream>

int main() {
    // OpenCV示例
    cv::Mat img = cv::Mat::zeros(100, 100, CV_8UC3);
    cv::circle(img, cv::Point(50, 50), 30, cv::Scalar(0, 0, 255), -1);
    cv::imwrite("circle.png", img);
    std::cout << "Saved image using OpenCV" << std::endl;

    // PCL示例
    pcl::PointCloud<pcl::PointXYZ> cloud;
    cloud.width = 5;
    cloud.height = 1;
    cloud.is_dense = false;
    cloud.points.resize(cloud.width * cloud.height);

    for (auto& point : cloud.points) {
        point.x = 1024 * rand() / (RAND_MAX + 1.0f);
        point.y = 1024 * rand() / (RAND_MAX + 1.0f);
        point.z = 1024 * rand() / (RAND_MAX + 1.0f);
    }
    
    pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
    std::cout << "Saved PCD file using PCL" << std::endl;

    return 0;
}

copy_libs.sh

#!/bin/bash

# 可执行文件路径
EXECUTABLE=project
# 动态库目标目录
DEST_DIR=libs

# 创建libs目录
mkdir -p ${DEST_DIR}

# 使用ldd获取依赖库并复制到libs目录
ldd ${EXECUTABLE} | grep "=>" | awk '{print $3}' | while read lib; do
    if [ -f "$lib" ]; then
        cp -v "$lib" ${DEST_DIR}
    fi
done

编译工程

cd build
cmake ..
make
../copy_libs.sh
make package

在build文件下生成了对应的文件,这里以ZIP为例,将文件拷贝到另一台主机上,主要系统要一致。

export LD_LIBRARY_PATH=/path/install/lib/:$LD_LIBRARY_PATH
cd bin
./project

其他:

dpkg -c project-0.0.4-Linux.deb     	# 查看包信息

参考链接:

https://www.cnblogs.com/mxnote/articles/16816344.html
https://zhuanlan.zhihu.com/p/141956373
https://blog.csdn.net/cxsydzn/article/details/143266496

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

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

相关文章

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中&#xff0c;我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API&#xff0c;包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库&#xff0c;并创建user 表 …

113页PPT制造业研发工艺协同及制造一体化

研发工艺协同及制造一体化解决方案是制造业数字化转型的重要组成部分&#xff0c;它涵盖了从产品设计到生产的全过程&#xff0c;旨在提高生产效率、降低成本、提升产品质量&#xff0c;并增强企业的市场竞争力。以下是对该解决方案的详细阐述&#xff1a; 一、方案概述 研发…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(14)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …

手机ip地址异常怎么解决

在现代社会中&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。然而&#xff0c;有时我们会遇到手机IP地址异常的问题&#xff0c;这不仅会影响我们的网络体验&#xff0c;还可能带来安全隐患。本文…

STM32低功耗设计NFC与无线距离感应智能钥匙扣

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 在当今快速发展的物联网&#xff08;IoT&#xff09;时代&#xf…

Pyhon基础数据结构(列表)【蓝桥杯】

a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表&#xff08;list&#xff09;有由一系列按照特定顺序排序的元素组成 列表是有顺序的&#xff0c;访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…

关于win11电脑连接wifi的同时,开启热点供其它设备连接

背景&#xff1a; 我想要捕获手机流量&#xff0c;需要让手机连接上电脑的热点。那么问题来了&#xff0c;我是笔记本电脑&#xff0c;只能连接wifi上网&#xff0c;此时我的笔记本电脑还能开启热点供手机连接吗&#xff1f;可以。 上述内容&#xff0c;涉及到3台设备&#x…

SAP SD学习笔记13 - 出库确认(发货)之后的取消 - VL09

上一章讲了出荷传票的总结&#xff0c;以及出荷相关的其他知识&#xff0c;比如出荷控制&#xff0c;出荷传票登录的各种Tr-cd&#xff0c;Picking场所的决定&#xff0c;出荷传票的变更等内容。 SAP SD学习笔记12 - 出荷传票总结&#xff0c;出荷控制(出荷Type&#xff0c;出…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

MyBatisPlus(Spring Boot版)的基本使用

1. 初始化项目 1.1. 配置application.yml spring:# 配置数据源信息datasource:# 配置数据源类型type: com.zaxxer.hikari.HikariDataSource# 配置连接数据库信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus?characterEncodi…

串口DMA接收不定长数据

STM32F767—&#xff1e;串口通信接收不定长数据的处理方法_stm32串口超时中断-CSDN博客 STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号_stm32 hal usart2 dma-CSDN博客 #define USART1_RxBuffSize 100 extern DMA_HandleTypeDef hdma_usart1_rx; //此处声明的变量在…

【Linux】进程字段、环境变量与进程地址空间

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;无人机场景车辆检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…

【C++】vector 类模拟实现:探索动态数组的奥秘

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 如果你对string&#xff0c;vector还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; 之前文章&#x1f525;&#x1f52…

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

初识算法 · 模拟(1)

目录 前言&#xff1a; 替换所有的问号 题目解析 算法原理 算法编写 提莫攻击 题目解析 算法原理 算法编写 外观数列 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是模拟&#xff0c;通过三道题目讲解&#xff0c;一道是提莫攻击&#xff0c;一道是…

使用 Vue 和 Create-Vue 构建工程化前端项目

目录 前言1. 工程化的意义与 Vue 的生态支持2. 搭建 Vue 工程化项目2.1 环境准备2.2 使用 create-vue 创建项目2.2.1 初始化项目2.2.2 安装依赖2.2.3 本地运行 3. Vue 项目的目录结构解析4. Vue 开发流程详解4.1 项目入口与根组件4.1.1 main.js 的作用4.1.2 App.vue 的结构 4.2…

Android中的AMS(Activity Manager Service)详解

Android中的AMS&#xff08;Activity Manager Service&#xff09;详解 AMS (Activity Manager Service) 是 Android 系统中非常核心的服务之一&#xff0c;它负责管理应用程序的生命周期、任务栈、进程、广播、服务等功能。AMS 是整个 Android Framework 的调度中心&#xff…

31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 : xor 压缩value原理xor压缩过程讲解xor压缩prometheus源码解读xor 压缩效果 xor 压缩value原理 原理:时序数据库相邻点变化不大&#xff0c;采用异或压缩float64的前缀和后缀0个数 xor压缩过程讲解 第一个值使用原始点存储计算和前面的值的xor 如果XOR值为0&…

UNIAPP发布小程序调用讯飞在线语音合成+实时播报

语音合成能够将文字转化为自然流畅的人声&#xff0c;提供100发音人供您选择&#xff0c;支持多语种、多方言和中英混合&#xff0c;可灵活配置音频参数。广泛应用于新闻阅读、出行导航、智能硬件和通知播报等场景。 在当下大模型火爆的今日&#xff0c;语音交互页离不开语音合…