当前位置: 首页 > article >正文

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

有时需要将程序在其他电脑上执行,需要将第三方库同时进行打包,这里以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

http://www.kler.cn/a/393717.html

相关文章:

  • 缓存与数据库不一致的解决方案:深入理解与实践
  • Mysql数据库里的SSH连接
  • Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
  • 传奇996_21——龙岭事件
  • Jmeter性能测试 -3数据驱动实战
  • 计算机网络(3)网络拓扑和IP地址,MAC地址,端口地址详解
  • 机器学习—决定下一步做什么
  • 关于学习炸鸡佬智能手表 应用硬件IIC1来取代原来软件模拟的IIC
  • Java编程优化:深入理解多态和接口中的方法实现
  • 支持向量机 SVM
  • 密码学在网络安全中的应用
  • 基于ABNF语义定义的HTTP消息格式
  • 基于微信小程序的电商平台+LW示例参考
  • html文本元素
  • 第三次作业
  • 浅谈:基于三维场景的视频融合方法
  • 丹摩征文活动 | 丹摩智算平台:服务器虚拟化的璀璨明珠与实战秘籍
  • C++设计模式和编程框架两种设计元素的比较与相互关系
  • Jenkins常见问题
  • 计算机网络(5)
  • Java final关键字
  • ios swift开发--ios远程推送通知配置
  • leetcode83. Remove Duplicates from Sorted List
  • 域名绑定服务器小白教程
  • LeetCode 热题100之技巧关卡
  • Leetcode:118. 杨辉三角——Java数学法求解