在Linux下運用ROS系統可免去很多建構架構的步驟,是以一般隻要按照官網給的教程逐漸進行即可。但是ROS自身有許多的毛病,比如其穩定性和實時性差,有時候資料傳輸會發現丢失的現象,是以其性能不如一般的C++編寫的架構好。是以本人經常會先采用ROS系統實作基本功能,然後再采用去ROS的步驟建構非ROS系統。而建構一般的C++系統需要對CMakeLists.txt檔案進行合理的編寫,在這裡隻介紹CMakeLists.txt檔案中的部分指令實作簡單C++程式的編譯(其實CMakeLists.txt檔案的編寫方式與ROS的相同)。
一般來說編譯單個C++源檔案隻需要采用g++指令即可,但是一般工程都是包含幾個,幾十個乃至幾百個源檔案。此時,如果用g++指令一個一個去編譯就會非常麻煩。是以Linux采用了make指令來根據makefile中的相關規則編譯所有的源檔案。關于g++、make、cmake和CMakeList.txt之間的關系,我的另外一篇筆記有粗略的記載,有興趣可以看看:
http://blog.csdn.net/bigdog_1027/article/details/79073194
建立C++工程目錄
首先就是需要給C++工程建立一個目錄以便管理,具體方法如下: (1)打開Linux(我預設是Ubuntu)的終端,進入要建立C++工程的目錄。

(2)采用mkdir指令建立C++工程目錄,名字可以根據自己需要取。
$ mkdir hello_world |
(3)進入建立工程目錄下面,并依次建立bin、lib、src、include和build目錄。這幾個目錄依次用于放置C++可執行檔案、生成的連結庫、源檔案、頭檔案和編譯生成的檔案。當然,還需要建立一個CMakeLists.txt檔案用于編譯整個工程。
$ cd hello_world $ mkdir bin $ mkdir lib $ mkdir src $ mkdir include $ mkdir build $ touch CMakeLists.txt |
執行上述指令後,在工程目錄下就會生成對應的檔案了。
(4)進入src目錄下,建立源檔案。
$ cd src $ touch main.cpp $ touch hello_world.cpp |
(5)同樣傳回上一級目錄并進入include目錄,建立頭檔案。
$ cd ../include/ $ touch hello_world.h |
(6)然後打開上面建立的源檔案和頭檔案,依次輸入自己對應的程式,儲存并退出。
(7)然後就是比較重要的一塊,即編寫CMakeLists.txt檔案。在這裡,我隻記錄了基本的使用,一些更加複雜的編寫方式以後遇到再補充。一般開頭都是給出要求cmake最低版本以及工程名稱,如下:
cmake_minimum_required(VERSION 2.8) project(hello_world) |
然後就是可将編譯方式設定為Release,該模式對應的模式為debug。後者是調試模式,系統運作會慢很多。是以要求有比較高效的運作方式,建議選擇Release,如下:
SET(CMAKE_BUILD_TYPE Release) |
然後設定可執行檔案與連結庫儲存的路徑,設定方式如下:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) |
然後設定頭檔案目錄使得系統可以找到對應的頭檔案,如下:
include_directories( ${PROJECT_SOURCE_DIR}/include ) |
然後選擇需要編譯的源檔案,凡是要編譯的源檔案都需要列舉出來。
add_executable(hello_world src/hello_world.cpp src/main.cpp) |
完整的CMakeLists.txt檔案内容如下圖所示:
(8)CMakeLists.txt檔案編寫結束以後就可以對工程進行編譯了,進入build目錄。并執行cmake和make指令,如下:
$ cd build $ cmake .. $ make |
如果程式沒有錯誤的,那麼就會出現以下編譯通過的結果。
(9)編譯通過以後就會在對應的bin檔案夾中生成可執行檔案,打開bin檔案夾可以看到。
(10)在終端下進入bin目錄,運作該可執行檔案可得到如下結果: