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...