catkin build的config設置指南[設置多種make模式或策略]

在本篇文章中,我們來盡可能詳細地深入探討 catkin config 的使用方法。這是掌握 catkin_tools 工作流的關鍵,能極大地提升你的開發效率和項目的規范性。

catkin config 的核心思想

首先,要理解它的核心思想:為你的 Catkin 工作空間創建一個持久化的、可被版本控制的配置

在沒有 catkin_tools 的年代(使用 catkin_make),如果你想給編譯過程傳遞一個參數,比如開啟優化,你必須每次都這樣寫:

# 每次編譯都要寫,很麻煩
catkin_make -DCMAKE_BUILD_TYPE=Release

如果你忘了寫,那這次編譯就不是 Release 模式了。這非常繁瑣且容易出錯。

catkin config 就是為了解決這個問題。你用 catkin config 設置一次,這個配置就會被保存下來,之后每一次運行 catkin build 都會自動使用這個配置,直到你再次修改它。


配置是如何存儲的?

當你第一次在工作空間運行 catkin initcatkin config 時,它會在你的工作空間根目錄下創建一個隱藏文件夾 .catkin_tools。所有的配置信息都以 YAML 文件的形式存儲在這里面,通常是:

<your_ws>/.catkin_tools/profiles/default/config.yaml

default 是默認的配置文件名。你可以把它理解為“當前激活的配置”。

你通常不應該手動編輯這個 YAML 文件,而是通過 catkin config 命令來安全地修改它。


catkin config 的常用操作

1. 查看當前配置

這是最基本的操作。想知道當前工作空間都設置了些什么?

# 顯示當前激活配置的詳細信息
catkin config# 或者使用更簡潔的別名
catkin config -l

示例輸出:

這個輸出告訴你:

  • 當前用的是 default 配置。
  • 工作空間繼承自 ROS 的主環境 /opt/ros/noetic
  • 各個目錄(build, devel 等)的位置。
  • 最重要的:
    • CMake 參數 (CMAKE_ARGS): 編譯時會傳遞 -DCMAKE_BUILD_TYPE=RelWithDebInfo 給 CMake。
    • Make 參數 (MAKE_ARGS): 編譯時會使用 make -j32,即 32 線程并行編譯。
2. 設置/修改配置項

這是最核心的用法。

A. 設置 CMake 參數 (--cmake-args)

這是最常用的功能,用來向 CMake 傳遞 -D 開頭的變量。

  • 設置編譯類型為 Release (開啟優化,去除調試信息)

    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
    

    運行后,再 catkin config -l 看看,CMAKE_ARGS 就變了。現在每次 catkin build 都會是優化過的版本。

  • 設置編譯類型為 Debug (包含調試信息,方便 GDB 調試)

    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Debug
    
  • 添加多個 CMake 參數

    catkin config --cmake-args -DCMAKE_BUILD_TYPE=Debug -DOTHER_VAR=True
    
  • 在現有參數基礎上追加 (Append)
    假設你已經設置了 Debug 模式,現在想再加一個參數,但不想覆蓋掉原來的。

    catkin config --append-args -DNEW_FLAG=ON
    

    注意: 如果不加 --append-args,新的設置會覆蓋掉所有舊的 CMAKE_ARGS

B. 設置 Make 參數 (--make-args)

用來控制 make 命令本身的行為。

  • 設置并行編譯的線程數
    # 使用 8 個線程編譯
    catkin config --make-args -j8
    # 使用與 CPU 核心數相同的線程數,并保留 2 個核心空閑
    catkin config --make-args -j$(nproc) -l$(nproc)
    

C. 設置安裝目錄 (--install)

默認情況下,catkin build 只會生成 devel 空間。如果你想生成一個可以被部署到其他機器上的 install 空間(類似于 /opt/ros/noetic 的結構),你需要開啟安裝選項。

# 開啟安裝功能,產物會出現在 <ws>/install 目錄
catkin config --install

D. 拉黑/白名單包 (--blacklist / --whitelist)

如果你的 src 目錄里有些包你暫時不想編譯它,可以拉黑。

# 編譯時忽略 my_buggy_pkg 和 another_pkg
catkin config --blacklist my_buggy_pkg another_pkg

反之,也可以只編譯白名單里的包。

3. 清除配置
  • 清除所有 CMake 參數
    catkin config --cmake-args ""
    
  • 清除所有配置,恢復到初始狀態
    catkin config --clear-all
    

殺手級功能:配置文件 (Profiles)

這是 catkin_tools 最強大的功能之一。你可以為不同的場景創建不同的配置集,并隨時切換。

最常見的場景:調試 (Debug) vs. 發布 (Release)

工作流示例:

  1. 查看當前有的 Profiles

    catkin profile list
    # 輸出可能只有:
    # default (active)
    
  2. 創建新的 Profiles

    # 創建一個叫 'debug' 的 profile
    catkin profile add debug# 創建一個叫 'release' 的 profile
    catkin profile add release
    
  3. 分別為不同的 Profile 設置配置

    • 配置 release Profile:
      # 注意 --profile release 參數
      catkin config --profile release --cmake-args -DCMAKE_BUILD_TYPE=Release
      
    • 配置 debug Profile:
      catkin config --profile debug --cmake-args -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-O0 -g"
      
      這里我們還額外加了 C++ 編譯器的標志,-O0 關閉優化,-g 生成調試符號。
  4. 在 Profiles 之間切換

    • 激活 release Profile:

      catkin profile set release
      

      現在,你再運行 catkin config -l,看到的就是 release 的配置了。此時運行 catkin build 就會編譯出優化版本。

    • 激活 debug Profile:

      catkin profile set debug
      

      現在運行 catkin build 就會編譯出帶調試符號的版本,可以用 GDB 來調試。

  5. 臨時使用某個 Profile 進行構建
    你也可以不切換全局激活的 Profile,只在本次構建時臨時使用。

    catkin build --profile debug
    

最佳實踐和注意事項

  1. cleanbuild:當你切換了影響編譯結果的核心配置(尤其是 CMAKE_BUILD_TYPE)后,最好先運行 catkin cleancatkin clean <package_name> 來清除舊的編譯產物,然后再運行 catkin build,以確保新的配置被完全應用。

  2. 充分利用 Profiles:為不同的任務(調試、發布、測試)建立不同的 Profile,這是一個非常好的習慣,能讓你的工作流非常清晰和高效。

  3. 定期檢查:時不時用 catkin config -l 檢查一下當前的配置,確保它符合你的預期。

  4. 將配置納入版本控制.catkin_tools 目錄可以被 Git 等版本控制工具管理起來。這樣,團隊里的每個成員 clone 倉庫后,就可以使用完全相同的構建配置,保證了環境的一致性。

通過熟練使用 catkin configcatkin profile,你可以像專業開發者一樣,精確、高效地管理你的 ROS 項目構建過程。

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

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

相關文章

Ubuntu掛載和取消掛載

在 Ubuntu 中&#xff0c;掛載&#xff08;Mount&#xff09;和取消掛載&#xff08;Unmount&#xff09;是管理存儲設備&#xff08;如硬盤、U盤、ISO鏡像等&#xff09;的常見操作。以下是詳細指南&#xff1a;1. 掛載&#xff08;Mount&#xff09; 1.1 查看可用存儲設備 ls…

Vue開發常用庫(含npm安裝命令)

Vue開發常用庫&#xff08;含npm安裝命令&#xff09; 核心生態系統&#xff1a;Vue Router - 官方路由管理器 npm install vue-router4 # Vue 3 npm install vue-router3 # Vue 2Pinia - 新一代狀態管理庫 npm install piniaVuex - 傳統狀態管理庫 npm install vuexnext …

[硬件電路-39]:激光光路的光信號處理、模擬電路的電信號處理、數字電路的電信號處理、軟件的信號處理,有哪些共通的操作、運算、變換?

激光光路、模擬電路、數字電路及軟件中的信號處理在操作、運算和變換層面存在顯著共性&#xff0c;這些共性體現了信號處理的核心邏輯在不同技術領域的通用性。以下是具體分析&#xff1a; 目錄 一、共通操作&#xff1a;信號處理的基礎動作 1、放大與衰減 2、濾波 3、調制…

Grails(Groovy)框架拋出NoHandlerFoundException而不是返回404 Not Found

本文記錄在基于Spring(Boot)框架&#xff08;使用Java語言&#xff09;和Grails框架&#xff08;使用Groovy語言&#xff09;下&#xff0c;開發Controller接口&#xff0c;對不存在的URL請求&#xff0c;接口返回404 not found&#xff0c;而不是拋出NoHandlerFoundException異…

muduo中事件循環線程池的理解

事件循環線程池的理解前置知識reactor模型thread::start()方法的理解創建線程池子線程被喚醒的幾種情況子線程被主線程喚醒新連接到來有消息需要發送時&#xff08;多reactor情況時&#xff09;關閉連接時子線程被喚醒執行任務在 上一篇中&#xff0c;我們討論了關于簡單的線程…

AI智能體“上下文工程”實踐:來自 Manus 項目的經驗總結

轉載&#xff1a;https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus 在啟動 Manus (manus.im/app) 項目之初&#xff0c;我的團隊面臨一個關鍵抉擇&#xff1a;究竟是基于開源基礎模型訓練一個端到端的智能體模型&#xff0c;還是在前沿大…

day19 鏈表

定義鏈式存儲的線性表頭文件相關定義 typedef int datatype;//定義數據域類型 typedef struct Node {union{int len; //頭結點數據域datatype data; //普通節點數據域};struct Node *next; //節點指針域 }Node,*Node_ptr;鏈表的函數 注意事項 1.創建節點時&#xff0c;需要初…

【第三節】Class與Style綁定

文章目錄Class與Style綁定綁定HTML Class對象語法數組語法綁定內聯樣式對象語法數組語法自動添加前綴Class與Style綁定 數據綁定一個常見需求是操作元素的 class 列表和它的內聯樣式,因為它們都是屬性&#xff0c;我們可以用 v-bind 處理它們:我們只需要計算出表達式最終的字符…

CMOS知識點 離子注入工藝

知識點8&#xff1a;離子注入是為了將摻雜劑&#xff08;如硼、磷等&#xff09;精確引入硅晶片的近表面區域&#xff0c;以改變其電學性質。工藝過程&#xff1a;電離與加速&#xff1a;摻雜劑原子在離子源中被電離&#xff08;帶電&#xff09;&#xff0c;通過高壓電場&…

從安裝到上手:Ubuntu 22.04 玩轉 Containerd 2.1.3 容器運行時

Containerd 是一款支持 OCI 規范的容器運行時&#xff0c;注重容器部署和生命周期管理的簡單性、健壯性與可移植性&#xff0c;常被嵌入到 Docker 和 Kubernetes 等系統中。本文將詳細介紹在 Ubuntu 22.04 服務器上通過二進制包手動安裝 Containerd 的完整步驟&#xff0c;包括…

Hadoop與云原生集成:彈性擴縮容與OSS存儲分離架構深度解析

Hadoop與云原生集成的必要性Hadoop在大數據領域的基石地位作為大數據處理領域的奠基性技術&#xff0c;Hadoop自2006年誕生以來已形成包含HDFS、YARN、MapReduce三大核心組件的完整生態體系。根據CSDN技術社區的分析報告&#xff0c;全球超過75%的《財富》500強企業仍在使用Had…

飛算科技:以創新科技引領數字化變革,旗下飛算 JavaAI 成開發利器

作為國家級高新技術企業&#xff0c;飛算科技專注于自主創新&#xff0c;在數字科技領域持續深耕&#xff0c;用前沿技術為各行業客戶賦能&#xff0c;助力其實現數字化轉型升級的飛躍。?飛算科技憑借深厚的技術積累&#xff0c;將互聯網科技、大數據、人工智能等技術與實際應…

多線程Python爬蟲:加速大規模學術文獻采集

1. 引言 在學術研究過程中&#xff0c;高效獲取大量文獻數據是許多科研工作者和數據分析師的需求。然而&#xff0c;傳統的單線程爬蟲在面對大規模數據采集時&#xff0c;往往效率低下&#xff0c;難以滿足快速獲取數據的要求。因此&#xff0c;利用多線程技術優化Python爬蟲&a…

NX717NX720美光固態閃存NX724NX728

美光NX系列固態閃存深度解析&#xff1a;技術、性能與市場洞察一、技術架構與核心創新美光NX系列固態閃存&#xff08;包括NX717、NX720、NX724、NX728&#xff09;的技術根基源于其先進的G9 NAND架構。該架構通過5納米制程工藝和多層3D堆疊技術&#xff0c;實現了存儲單元密度…

淺談——C++和C#差異

雖然這個話題看著似乎有些關公戰秦瓊的味道&#xff0c;但是作為游戲開發者&#xff0c;C和C#一定是繞不開的兩門語言。不過雖然說是比較二者差異&#xff0c;因為我學習的過程主要是先學C&#xff0c;所以我先基于C的認知&#xff0c;再來聊聊C#之中的不同。&#xff08;為什么…

rocky9-zabbix簡單部署

目錄 一、準備 1、&#xff08;rocky9&#xff09; 2、配置數據庫 二、配置文件 1、導入初始架構與數據 2、配置相關文件 三、啟動服務 1、瀏覽器訪問 2、解決亂碼問題 ?編輯 四、監控 ① 添加主機 1、修改配置文件 2、啟動服務 3、網頁添加 ②添加監控模塊 1…

tabBar設置底部菜單選項、iconfont圖標(圖片)庫、模擬京東app的底部導航欄

歡迎來到我的UniApp技術專欄&#xff01;&#x1f389; 在這里&#xff0c;我將與大家分享關于UniApp開發的實用技巧、最佳實踐和項目經驗。 專欄特色&#xff1a; &#x1f4f1; 跨平臺開發一站式解決方案 &#x1f680; 從入門到精通的完整學習路徑 &#x1f4a1; 實戰項目經…

7.22總結mstp,vrrp

一、MSTP技術&#xfeff;&#xfeff;MSTI和MSTI域根&#xfeff;&#xfeff;MSTP中的端口角色3. MSTP工作原理 MSTP 計算方法? CST/IST的計算和RSTP類似 ? MSTI的計算僅限于區域內 ? MSTI計算參數包含在IST BPDU中&#xff0c;和IST的計 算同步完成&#xfeff;&#xfe…

【電腦】網卡的基礎知識

網卡&#xff08;Network Interface Card, NIC&#xff09;是計算機中用于連接網絡的關鍵組件之一&#xff0c;它負責管理和發送數據包到互聯網或其他局域網設備。下面是一些關于網卡的詳細知識&#xff1a;網卡的基本結構MAC地址&#xff1a;每個網卡都有一個唯一的物理地址&a…

IPv4枯竭時代:從NAT技術到IPv6的演進之路

&#x1f50d; 開發者資源導航 &#x1f50d;&#x1f3f7;? 博客主頁&#xff1a; 個人主頁&#x1f4da; 專欄訂閱&#xff1a; JavaEE全棧專欄 IPv4&#xff08;Internet Protocol version 4&#xff09;是互聯網最核心的通信協議之一&#xff0c;自 1981 年正式標準化以來…