對於PCL 庫中的各個模塊之間是有相互依賴關系的
其中Common模塊是最基礎的模塊,其中是定義各種數據結構的頭文件,所以Common這個模塊是不需要依賴性響的,但是IO 模塊就是需要common和Octree兩大模塊的支持,這時候應該怎么引用他們的依賴項呢,這里就需要講解如何讓構建靜態庫與動態庫了,那么靜態庫和動態庫一般是提供各種函數以供其他編程算法的實現,
這里首先給一個簡單的說明建立一個工程文件需要的CMAKE建立的方式“
(1)新建一個文件夾HEllo_cmake文件
(2)首先建立include 文件建立頭文件libHelloCMAKE.h文件:
#ifndef LIBHELLOCMAKE_H_ #define LIBHELLOCMAKE_H_ // 上面的宏定義是為了防止重復引用這個頭文件而引起的重定義錯誤 void printHello(); #endif
(3)建立src文件,新建libHelloCMAKE.cpp,該函數就是實現.h文件中申明的void printHello(); 函數,具體內容如下:
//這是一個實現代碼功能的函數 #include <iostream> using namespace std; void printHello() { cout<<"Hello CMake"<<endl; }
(4)新建main文件,該文件是是建立主函數 實現我們的上面寫的打印hello CMAKE函數,新建useHello.cpp文件 :
#include "libHelloCMAKE.h" // 使用 libHelloCMAKE.h 中的 printHello() 函數 int main( int argc, char** argv ) { printHello(); return 0; }
(4)接下來就是如果寫cmake文件進行編譯生成動態鏈接庫,以及寫一個函數應用我們生成的鏈接庫.
我們在hello_cmake文件中新建CMakeList.txt文件,文件內容如下:
# 聲明要求的 cmake 最低版本 cmake_minimum_required( VERSION 2.8 ) # 聲明一個 cmake 工程 project( Hellocmake) set (CMAKE_CXX_COMPILER "g++") # 設置編譯模式 set( CMAKE_BUILD_TYPE "Debug" ) #set (CMAKE_BUILD_TYPE "Release") set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" ) #這里是添加cmake其他依賴庫的cmake 文件 #list (APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules) #生成可執行文件的路徑 set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build) #設置生成的可鏈接的庫路徑 set (LIBRAYR_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib) #set( THIRD_PARTY_LIBS # ) include_directories (${PROJECT_SOURCE_DIR}/include) #添加有cmake的二級文件 add_subdirectory(src) add_subdirectory(main)
(5)在src中同樣新建CMakeLists.txt 文件內容為:
#############編譯一個動態鏈接庫###################
# 添加一個庫
add_library( hello libHelloCMAKE.cpp )
# 共享庫
add_library( hello_shared SHARED libHelloCMAKE.cpp )
(6)在main文件下新建CMakeLists.txt ,文件內容:
# 添加一個可執行程序
# 語法:add_executable( 程序名 源代碼文件 )
add_executable( useHello useHello.cpp )
# 將庫文件鏈接到可執行程序上
target_link_libraries( useHello hello_shared )
#或者可以寫為
#target_link_libraries(useHello libhello_shared.so)
(7)這時候一個工程文件就已經建立了,我們需要編譯即可:
在hello_cmake文件下執行以下命令:
mkdir build
cd build
cmake ..
make
執行的結果:
可以看到我們已經生成了動態的鏈接庫文件libhello_shared.so
以及靜態鏈接庫libhello.a
可以直接運行程序
如何通過 INCLUDE_DIRECTORIES 指令加入非標准的頭文件搜索路徑。
如何通過 LINK_DIRECTORIES 指令加入非標准的庫文件搜索路徑。
如果通過 TARGET_LINK_LIBRARIES 為庫或可執行二進制加入庫鏈接。
以及如何鏈接到靜態庫。
關於CMake中的一些常用變量:
(1)CMAKE_SOURCE_DIR , PROJECT_SOURCE_DIR ,<projectname>_SOURCE_DIR 都代表這工程的頂層目錄
(2)CMAKE_CURRENT_SOURCE_DIR 指的是當前處理的 CMakeLists.txt 所在的路徑
(3)CMAKE_CURRENT_LIST_FILE 輸出調用這個變量的 CMakeLists.txt 的完整路徑
(4)CMAKE_MODULE_PATH
這個變量用來定義自己的 cmake 模塊所在的路徑。如果你的工程比較復雜,有可能會自己 編寫一些 cmake 模塊,這些 cmake 模塊是隨你的工程發布的,為了讓 cmake 在處理
CMakeLists.txt 時找到這些模塊,你需要通過 SET 指令,將自己的 cmake 模塊路徑設 置一下。
比如 SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) 這時候你就可以通過 INCLUDE 指令來調用自己的模塊了。這種定義CMAKE模塊的方式在PCL中也是有的
(5)EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 分別用來重新定義最終結果的存放目錄,前面我們已經提到了這兩個變量。
(6)ROJECT_NAME 返回通過 PROJECT 指令定義的項目名稱。
CMAKE中調用環境變量的方式
(1) 設置環境變量的方式是: SET(ENV{變量名} 值) 比如上面的例子就有用到
(2)CMAKE_INCLUDE_CURRENT_DIR 自動添加 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR 到當前處理
的 CMakeLists.txt。相當於在每個 CMakeLists.txt 加入: INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
CMAKE中的開關選項
(1)CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,用來控制 IF ELSE 語句的書寫方式
(2)BUILD_SHARED_LIBS 這個開關用來控制默認的庫編譯方式,如果不進行設置,使用 ADD_LIBRARY 並沒有指定庫 類型的情況下,默認編譯生成的庫都是靜態庫。 如果 SET(BUILD_SHARED_LIBS ON)后,默認生成的為動態庫。
(3)CMAKE_C_FLAGS 設置 C 編譯選項,也可以通過指令 ADD_DEFINITIONS()添加。
(4)CMAKE_CXX_FLAGS 設置 C++編譯選項,也可以通過指令 ADD_DEFINITIONS()添加。
這是一個簡單的建立CMake的工程教程,接下來將會詳細介紹PCL 中的更多內容
以上內容如有錯誤或者需要補充的,請留言!同時歡迎大家關注微信公眾號,積極分享投稿,做到大家一起分享,拒絕只做個伸手黨!或者加入3D視覺微信群或QQ交流群,一起交流分享!
投稿或聯系群主郵箱:dianyunpcl@163.com
原創不易,轉載請聯系群主,注明出處。
Share together, up together
視覺點雲