CMake結合PCL庫學習(2)

對於PCL 庫中的各個模塊之間是有相互依賴關係的ios

其中Common模塊是最基礎的模塊,其中是定義各類數據結構的頭文件,因此Common這個模塊是不須要依賴性響的,可是IO 模塊就是須要commonOctree兩大模塊的支持,這時候應該怎麼引用他們的依賴項呢,這裏就須要講解如何讓構建靜態庫與動態庫了,那麼靜態庫和動態庫通常是提供各類函數以供其餘編程算法的實現,c++


這裏首先給一個簡單的說明創建一個工程文件須要的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文件進行編譯生成動態連接庫,以及寫一個函數應用咱們生成的連接庫.ui

咱們在hello_cmake文件中新建CMakeList.txt文件,文件內容以下:spa

 

# 聲明要求的 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 文件內容爲:c++11

 

#############編譯一個動態連接庫###################
# 添加一個庫
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

                                                                                                                          視覺點雲

                                                                                                     

相關文章
相關標籤/搜索