CMake結合PCL庫學習(3)

2021-09-07 18:17:09 字數 3422 閱讀 5871

cmake常用指令結合pcl 的頂層cmake檔案的解釋

基本指令

(1)add_definitions 向 c/c++編譯器新增-d 定義,比如:

add_definitions(-denable_debug -dabc),引數之間用空格分割。

如果你的**中定義了#ifdef enable_debug #endif,這個**塊就會生效。

如果要新增其他的編譯器開關,可以通過 cmake_c_flags 變數和 cmake_cxx_flags 變

量設定。

在pcl中有

add_definitions("

-dboost_disable_asserts -deigen_no_debug

")

這句話的意思就是如果定義了#ifdef boost_disable_asserts #endif  和

#ifdef eigen_no_debug #endif的話中間的**就會有效

(2)add_dependencies 定義 target 依賴的其他 target,確保在編譯本 target 之前,其他的 target 已經被構建。

add_dependencies(target-name depend-target1 depend-target2 ...)

(3)add_test 與 enable_testing 指令。 enable_testing 指令用來控制 makefile 是否構建 test 目標,涉及工程所有目錄。語法很簡單,沒有任何引數,enable_testing(),一般情況這個指令放在工程的主

cmakelists.txt 中.  pcl 中是有test的模組的所以在主cmakelists.txt中是有這句話的

### ---[ set up for tests enable_testing()

add_test 指令的語法是:

add_test(testname exename arg1 arg2 ...) testname 是自定義的 test 名稱,exename 可以是構建的目標檔案也可以是外部指令碼等等。後面連線傳遞給可執行檔案的引數。如果沒有在同乙個 cmakelists.txt 中開啟 enable_testing()指令,任何 add_test 都是無效的。

(4)aux_source_directory

基本語法是:

aux_source_directory(dir variable) 作用是發現乙個目錄下所有的源**檔案並將列表儲存在乙個變數中,這個指令臨時被用來 自動構建原始檔列表。因為目前 cmake 還不能自動發現新新增的原始檔。

(5)cmake_minimum_required

其語法為 cmake_minimum_required(version versionnumber [fatal_error])

比如 cmake_minimum_required(version 2.8 fatal_error)

如果 cmake 版本小與 2.8 則出現嚴重錯誤,整個過程中止。

(6)find_指令

find_系列指令主要包含一下指令:      find_file(name1 path1 path2 ...)

var 變數代表找到的檔案全路徑,包含檔名

find_library(name1 path1 path2 ...)

var 變數表示找到的庫全路徑,包含庫檔名

find_path(name1 path1 path2 ...)

var 變數代表包含這個檔案的路徑。

find_program(name1 path1 path2 ...)

var 變數代表包含這個程式的全路徑。

find_package([major.minor] [quiet] [no_module]

[[required|components] [componets...]])

用來呼叫預定義在 cmake_module_path 下的 find.cmake 模組,你也可以自己

定義 find模組,通過 set(cmake_module_path dir)將其放入工程的某個目錄

中供工程使用,我們在後面的章節會詳細介紹 find_package 的使用方法和 find 模組的

編寫  find_library 示例: find_library(libx x11 /usr/lib)

(6)if 指令,基本語法為:

if(expression)

# then section.

command1(args ...)command2(args ...)

...else(expression)

# else section.

command1(args ...)

command2(args ...)

...endif(expression)

另外乙個指令是 elseif,總體把握乙個原則,凡是出現 if 的地方一定要有對應的

endif.出現 elseif 的地方,endif 是可選的。

表示式的使用方式有:

if(var),如果變數不是:空,0

,n, no, off, false, notfound 或

_notfound 時,表示式為真。

if(not

var),與上述條件相反。

if(var1 and var2),當兩個變數都為真是為真。

if(var1 or var2),當兩個變數其中乙個為真時為真。

if(command cmd),當給定的 cmd 確實是命令並可以呼叫是為真。

if(exists dir)或者 if(exists file),當目錄名或者檔名存在時為真。

if(file1 is_newer_than file2),當 file1 比 file2 新,或者 file1/file2 其

中有乙個不存在時為真,檔名請使用完整路徑。

if(is_directory dirname),當 dirname 是目錄時,為真。

if(variable matches regex)

if(string

matches regex)

當給定的變數或者字串能夠匹配正規表示式 regex 時為真。

乙個小例子,用來判斷平台差異:

if(win32)

message(status 「this

iswindows.」)

#作一些 windows 相關的操作

else(win32)

message(status 「this

isnot windows」)

#作一些非 windows 相關的操作

endif(win32)

上述**用來控制在不同的平台進行不同的控制,但是,閱讀起來卻並不是那麼舒服,

else(win32)之類的語句很容易引起歧義。

以上內容是從該書籍總結而得

PCL學習3 平面擬合

pcl平面擬合功能位於模組sample consensus中 pcl sample consensus 該模組基於 隨機抽樣一致演算法 random sample consensus 不僅可以用於平面擬合,也可以擬合柱面 球面等,對ransac的簡單解釋 ransac可以從一組包含 局外點 的觀測資...

PCL庫學習筆記(PCL Visualizer)

本文展示了pcl visualizer的幾種基本用法。的主體是點雲庫提供的源 由於其是由cmake進行編譯,有輸入引數的選擇問題。為了方便vs的除錯執行過程,將其中的輸入介面進行了修改 中學習到的幾個知識點 1 int main int argc,char ar 中arg和ar 引數的含義 8098...

PCL庫學習(1) 離群點濾波

本篇主講在用vs2012成功配置pcl1.7.2環境後,對table scene點雲進行離群點移除並視覺化顯示。首先參照 pcl點雲庫學習教程 使用statistical outlierremove濾波器移除離群點程式,詳見如下 include include include include int...