C++ linux打包運行方案(cmake)

文章目錄

  • 背景
  • 動態庫
  • 打包方案
    • 動態庫轉靜態庫
    • 動態庫打到軟件包中
  • 運行

背景

使用C++編寫的一個小項目,需要打包成ubuntu下的可執行文件,方便分發給其他ubuntu執行,因為docker鏡像方案過于臃腫,所以需要把項目的動態庫都打在軟件包中,分發之后可以直接運行,而不需要再重復安裝。

動態庫

經過依賴精簡和梳理,項目最終必須依賴的動態庫包括:pcl, yaml, rosbag(用于讀取rosbag包)

打包方案

第一步嘗試將所有動態庫轉為靜態庫安裝,發現 pcl 和 rosbag 間接依賴太多,只好暫時先將yaml庫轉為靜態庫,這里使用的方式是直接把yaml的源碼包含進來。

動態庫轉靜態庫

這里把yaml的源碼下載到 項目目錄/thirdparty/yaml-cpp目錄結構如下:

在這里插入圖片描述

在CMakeLists.txt中, 相關改動如下:

...
# 添加子目錄編譯 yaml-cpp 庫
add_subdirectory(thirdparty/yaml-cpp)
...
target_include_directories(ExeFileName PUBLIC ...${CMAKE_SOURCE_DIR}/thirdparty/yaml-cpp/include
)
target_link_libraries(ExeFileName PUBLIC ...yaml-cpp...
)
...

動態庫打到軟件包中

這里用到了linuxdeploy-x86_64.AppImage工具,安裝方式為:

wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -O /usr/local/bin/linuxdeploy
chmod +x /usr/local/bin/linuxdeploy

我們以pcl庫為例,實際依賴庫鏈接方式保持不變,只是需要在CMakeLists.txt最后加上對應的用于linuxdeploy的內容即可:

...
find_package(PCL REQUIRED COMPONENTS io)
...
target_include_directories(ExeFileName PUBLIC ${PCL_INCLUDE_DIRS}...
)# 鏈接庫
target_link_libraries(ExeFileName PUBLIC ${PCL_LIBRARIES} ...
)# 設置安裝路徑為 AppDir 結構
install(TARGETS ExeFileName DESTINATION usr/bin)# 設置 RPATH(確保運行時庫加載正確)
set_target_properties(ExeFileName PROPERTIESINSTALL_RPATH "$ORIGIN/../lib"  # 相對路徑指向 ../libBUILD_WITH_INSTALL_RPATH TRUEINSTALL_RPATH_USE_LINK_PATH TRUE
)# 修改原有的打包命令,確保在 Ubuntu 18.04 中兼容
add_custom_target(bundle_appimage_all_in_oneCOMMAND mkdir -p AppDir/usr/libCOMMAND linuxdeploy --appdir AppDir    -e $<TARGET_FILE:ExeFileName>        --output appimage     --plugin none             --executable $<TARGET_FILE:ExeFileName>  # 顯式指定可執行文件WORKING_DIRECTORY ${CMAKE_BINARY_DIR}DEPENDS ExeFileName
)

注意: 盡量在ubuntu低版本比如18.04上進行打包,以確保高版本ubuntu能向下兼容運行

在編譯打包腳本中需要增加linuxdeploy指令進行打包:

linuxdeploy --appdir AppDir -e ./ExeFileName \--library /lib/x86_64-linux-gnu/libusb-1.0.so.0 \--library /lib/x86_64-linux-gnu/libexpat.so.1

因為在運行時發現還是報錯,缺少依賴庫,所以在linuxdeploy打包時把缺少的動態庫顯式指定出來。

運行

運行命令為:

LD_LIBRARY_PATH=./AppDir/usr/lib ./AppDir/usr/bin/ExeFileName ...

這里要強制帶上LD_LIBRARY_PATH,這個問題有待解決,不過不影響使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76731.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux內核編譯(Ubuntu)

實驗內容&#xff1a;在系統中下載統一發行版本的版本號較高的內核&#xff0c;編譯之后運行自己編譯的內核&#xff0c;并使用uname-r命令查看是否運行成功。 實驗步驟&#xff1a; 1.查看實驗環境和內核版本 圖1 實驗環境 VMware中虛擬機Ubuntu&#xff08;24.04&#xff…

EdgeGPT - 新版Bing聊天功能逆向工程

本文翻譯整理自&#xff1a;https://github.com/acheong08/EdgeGPT 文章目錄 一、關于 EdgeGPT相關鏈接資源關鍵功能特性 二、安裝系統要求安裝命令 三、認證配置獲取Cookie步驟代碼中使用Cookie 四、使用方法1、命令行方式2、Python API方式使用Chatbot類使用Query輔助類 3、…

三網通電玩城平臺系統結構與源碼工程詳解(四):子游戲集成與服務器調度機制全解

本篇將深入講解三網通電玩城平臺中子游戲接入、前后端資源組織方式、服務器調度邏輯、并發接入方案等核心內容&#xff0c;重點覆蓋“李逵劈魚”、“水果瑪麗”、“瘋狂瑪麗”等熱門組件&#xff0c;輔以完整代碼框架與部署邏輯。 一、子游戲資源目錄結構與加載機制 平臺采用標…

1.1 AI大模型與Agent的興起及其對企業數字化轉型的推動作用

隨著人工智能技術的飛速發展&#xff0c;AI大模型和智能代理&#xff08;Agent&#xff09;的興起正成為推動企業數字化轉型的重要力量。從2017年GPT-1的首次亮相到2025年GPT-4和Qwen 2.5等多模態模型的成熟&#xff0c;AI大模型經歷了顯著的技術演進&#xff1b;與此同時&…

位運算練習:起床困難綜合征(貪心,位運算)(算法競賽進階指南學習筆記)

目錄 前情提要起床困難綜合征&#xff08;貪心&#xff0c;位運算&#xff09; 前情提要 一些基礎運算操作用法看看上一篇&#xff1b; 起床困難綜合征&#xff08;貪心&#xff0c;位運算&#xff09; 題目原文 [P2114 NOI2014] 起床困難綜合癥 - 洛谷 思路分析 題目很長…

PowerBi中REMOVEFILTERS怎么使用?

在 Power BI 的 DAX 中&#xff0c;REMOVEFILTERS() 是一個非常重要的函數&#xff0c;常用于取消某個字段或表的篩選上下文&#xff08;Filter Context&#xff09;&#xff0c;從而讓你的計算不受切片器&#xff08;Slicer&#xff09;、篩選器或視覺對象的限制。 ? 一、REM…

Vue3 實戰:打造多功能旅游攻略選項卡頁面

在旅游類應用開發中&#xff0c;為用戶提供全面、直觀的信息展示界面至關重要。本文將分享如何基于 Vue3 Axios 技術棧&#xff0c;實現一個包含攻略、游記、問答三大板塊的旅游攻略選項卡頁面&#xff0c;從樣式設計到交互邏輯&#xff0c;帶你深入了解整個開發過程。 項目背…

JavaScript性能優化實戰(1):性能優化基礎與性能分析工具

性能優化的重要性與業務價值 在當今競爭激烈的互聯網環境中,網站和應用的性能已成為用戶體驗和業務成功的關鍵因素。研究表明,頁面加載時間每增加1秒,轉化率可能下降7%,而53%的用戶會在頁面加載時間超過3秒后放棄訪問。這些數據直接揭示了性能優化對業務的巨大影響: 用戶…

Unity 腳本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于訪問被烘培好的 NavMesh. 使用NavMesh類可以執行空間查詢&#xff08;spatial queries&#xff09;&#xff0c;例如路徑查找和可步行性測試。此類還允許您設置特定區域類型的尋路成本&#xff0c;并調整尋路和避免的全局行為。 靜態屬性&#xff0…

Java 靜態內部類面試題與高質量答案合集

本文整理了關于 Java 靜態內部類&#xff08;Static Nested Class&#xff09;在面試中的高頻問題及標準答案&#xff0c;幫助你理解其底層原理、內存表現以及實際應用。 1. 什么是靜態內部類&#xff1f;和普通內部類有什么區別&#xff1f; 答&#xff1a; 靜態內部類是定義…

為什么買不到一定阻抗特性曲線的磁環

為什么買不到一定阻抗特性曲線的磁環&#xff1a; 磁環繞不同的圈數&#xff0c;阻抗特性曲線不同&#xff0c;磁環沒有類似于磁珠的特定頻率和阻抗特性曲線的磁環。 磁環與磁珠的核心區別&#xff1a; 磁珠是一種固定頻率阻抗器件&#xff0c;出廠時已通過材料和工藝設計確定…

【MATLAB海洋專題】歷史匯總

【MATLAB海洋專題】歷史匯總 目錄 01&#xff1a;海洋專題進階教學 02&#xff1a;海洋數據處理 03&#xff1a;海洋數據下載 04&#xff1a;海洋配色 05&#xff1a;海洋專題基礎教學 06: 其他基礎畫圖 07&#xff1a;python 畫海圖專題 08&#xff1a;模式相關文件制作 01…

數據倉庫ODS、DWD、DWS、ADS各層介紹

數據倉庫Data warehouse&#xff08;可簡寫為DW或者DWH&#xff09;建設的目的&#xff0c;是為前端查詢和分析作為基礎&#xff0c;主要應用于OLAP&#xff08;on-line Analytical Processing&#xff09;&#xff0c;支持復雜的分析操作&#xff0c;側重決策支持&#xff0c;…

動態提示詞(小模型)、RAG和提示詞系統

動態提示詞(小模型)、RAG和提示詞系統 目錄 動態提示詞(小模型)、RAG和提示詞系統小模型方案:動態提示詞基于規則的動態提示詞生成基于模板的動態提示詞生成基于小模型的動態提示詞生成基于強化學習的動態提示詞生成基于元學習的動態提示詞生成動態提示詞(小模型)RAG(檢…

并發設計模式實戰系列(3):工作隊列

&#x1f31f; ?大家好&#xff0c;我是摘星&#xff01;? &#x1f31f; 今天為大家帶來的是并發設計模式實戰系列&#xff0c;第三章工作隊列&#xff08;Work Queue&#xff09;??&#xff0c;廢話不多說直接開始~ 目錄 一、核心原理深度拆解 1. 生產者-消費者架構 …

云賬號安全事件應急響應指南:應對來自中國IP的異常訪問

在當今數字化時代,云服務已成為企業IT基礎設施的核心。然而,隨之而來的安全挑戰也日益突出。本文將詳細介紹當發現云賬號被來自中國的IP地址異常利用時,應如何快速有效地響應,以確保賬戶安全并最小化潛在風險。 1. 確認異常活動 首先,我們需要確認是否真的發生了安全事件…

三網通電玩城平臺系統結構與源碼工程詳解(五):客戶端熱更機制與多端資源分發流程

本篇將聚焦三網通平臺在多客戶端部署中的資源熱更機制設計、跨平臺同步策略、版本控制與前端資源發布管理&#xff0c;幫助開發者搭建高效穩定的資源更新系統。 一、資源分發平臺架構 為實現安卓端、iOS端、PC端的統一更新分發&#xff0c;平臺采用 Node.js Express 構建資源…

spark和hadoop的區別

一、spark概述 二、處理速度 三、 編程模型 四、實時性處理 五、spark內置模塊 六、spark的運行模式

AI寫代碼之GO+Python寫個爬蟲系統

下面我們我們來利用AI&#xff0c;來用GOPython寫個爬蟲系統。 幫我寫一個Python語言爬取數據寫入Mysql的案例&#xff0c;信息如下&#xff1a; 1、Mysql數據庫地址是&#xff1a;192.168.1.20 &#xff0c;mysql用戶名是&#xff1a;root&#xff0c; Mysql密碼是&#xff1…

從單模態到多模態:深度生成模型的演進歷程

在人工智能領域&#xff0c;生成模型的發展一直是研究熱點。從最早的自編碼器到如今的多模態擴散模型&#xff0c;這一技術路線不斷突破&#xff0c;為創意內容生成、數據增強和表示學習等領域帶來革命性變化。本文將詳細介紹幾種關鍵生成模型的技術原理和演進路徑&#xff0c;…