如何在QT中用cmake和qmake編譯PCL程序

up主,今天十分蛋疼,因爲姿勢欠缺,續航時間太有限,這次吃過午飯回來趕緊水一篇,要不然就睡着了,也給這個4月畫一個完美的冒號(表示開始了…)
今天介紹如何用qmake,配置qt中的pcl工程,以便可以順利編譯運行

大家都知道,qt工程有一個.pro文件,當然如果你建立了一個非qt工程就不會有(這句好像是廢話)
我們來看一下.pro的寫法(僅針對部分用法)

#-------------------------------------------------
#
# Project created by QtCreator 2015-04-01T01:21:16
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = lidar_PCD
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += main.cpp \
    readlidar.cpp \
    pointstopcd.cpp


HEADERS += \
    readlidar.h \
    pointstopcd.h

LIBS += \
# pcl
        -L/usr/local/lib \
        -lpcl_io -lpcl_common \
 # boost
        -L/usr/lib/x86_64-linux-gnu \
        -lboost_system -lboost_filesystem \

INCLUDEPATH +=/usr/include/pcl-1.7/ \
              /usr/include/eigen3 \

是不是很容易懂,QT +=core config += console 說明這是一個qtconsole工程,沒有用到gui,因此 QT-=gui,如果是一個widget或者ui基類,mainwindow,那麼qt+=gui
TARGET是目標工程的名稱,下面的SOURCES HEADERS 都是工程裏的文件,注意寫法。LIBS 是配置工程用到的靜態庫動態庫的路徑以及庫名。
例如這裏用到了boost裏的libboost_system.so 它在路徑
/usr/lib/x86_64-linux-gnu
因此這裏-L/usr/lib/x86_64-linux-gnu 大寫的L代表路徑
而庫名則寫成-lboost_system, lib省略了,只留下了-l, 請注意
INCLUDEPATH用來配置項目中外部頭文件的搜索路徑,這裏如果路徑是多個的話,記得每行末尾用 ‘\’ 割開,同時下一行直接黏上就哦了

通過上述方法,對.pro文件進行修改,可以讓qmake來編譯生成makefie,代替PCL cosole程序生成的CMakeList,不過qt也可以建立CMake工程,這樣就可以在qtcreator裏生成的CMakelist進行配置,下面我們來看一下對應的CMakeList應該怎麼寫(非常簡單 >^<)

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(lidar_PCD)

find_package(PCL 1.7 REQUIRED Qt4 COMPONENTS QtCore REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(lidar_PCD main.cpp readlidar.cpp pointstopcd.cpp readlidar.h pointstopcd.h)
target_link_libraries (lidar_PCD ${PCL_LIBRARIES})

不解釋了,因爲很容易懂。。。主要是我也不太會,這是copy的官網demo裏的
第一個是cmake的版本約束
project()確定了工程名稱,這裏是lider_PCD, 以後可以通過${PCL_PROJECT}引用
find_package(),需要包含的模塊組件,這裏是PCL 1.7 REQUIRE,表示包含所有PCL組件,如果想指定模塊組件,就用COMPONENTS 模塊名稱 gen
include_directories(${PCL_INCLUDE_DIRS}) pcl頭文件路徑配置
link_directories(${PCL_LIBRARY_DIRS}) pcl鏈接路徑配置
add_definitions(${PCL_DEFINITIONS}) pcl所需要的預處理器定義和編譯器標誌
這些宏定義都是pcl預留的,咱也可以用
SET(VAR_NAME var_value),來設置自定義變量名,下面就可以引用了
如下例:
SET(SEPC_INCLUDE_PATH /usr/local/include/.../...)
這裏定義了一個名爲SEPC_INCLUDE_PATH的宏定義變量
假設下面的CmakeLists就可以用
include_directories(${SEPC_INCLUDE_PATH})來包含進來了
注意要加${}

上面的宏定義不能省。他們是cmake從pcl目錄中自動找到的會自動設置
add_executable(lidar_PCD main.cpp readlidar.cpp pointstopcd.cpp readlidar.h pointstopcd.h)

這裏.h 文件可以不寫到add_executable裏,但是要在include_dirs都包含
這裏有個指令要介紹一下就是:
aux_source_directory(dir VAR_NAME)
作用是發現當前目錄下所有的源碼文件(名稱,包含類型)
如下:
aux_source_directory(. SRC_LIST)

target_link_libraries (lidar_PCD ${PCL_LIBRARIES}) 將剛剛配置的頭文件,庫文件搜索路徑告訴鏈接器,讓鏈接器鏈接用到的庫,這裏是由${PCL_LIBRARIES}指示,如果需要鏈接多個庫,請用空格隔開,例如:
target_link_libraries (lidar_PCD ${PCL_LIBRARIES} ${QT_LIBRARIES}) 

說明:

另外CMake裏的指令時大小寫insensitive的, 建議大寫

( 我怎麼都是小寫…好,下面大寫 )

調試的時候可以用

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "Message")
SEND_ERROR: 錯誤部分跳過,發送錯誤信息
STATUS: 輸出前綴唯一的信息
FATAL_ERROR: 致命的錯誤,立即終止cmake

功能是在終端上輸出一段“Message” 的信息.


說的有點粗糙,今天就到這裏了,還是困成狗,必須睡覺

發佈了34 篇原創文章 · 獲贊 31 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章