天天看點

CMake結合PCL庫學習(2)

緊接着上一篇文章

對于PCL 庫中的各個子產品之間是有互相依賴關系的

其中Common子產品是最基礎的子產品,其中是定義各種資料結構的頭檔案,是以Common這個子產品是不需要依賴性響的,但是IO 子產品就是需要common和Octree兩大子產品的支援,這時候應該怎麼引用他們的依賴項呢,這裡就需要講解如何讓建構靜态庫與動态庫了,那麼靜态庫和動态庫一般是提供各種函數以供其他程式設計算法的實作,

這裡首先給一個簡單的說明建立一個工程檔案需要的CMAKE建立的方式“

(1)建立一個檔案夾HEllo_cmake檔案

CMake結合PCL庫學習(2)

(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

執行的結果:

CMake結合PCL庫學習(2)

可以看到我們已經生成了動态的連結庫檔案libhello_shared.so

以及靜态連結庫libhello.a

可以直接運作程式

如何通過 INCLUDE_DIRECTORIES 指令加入非标準的頭檔案搜尋路徑。

如何通過 LINK_DIRECTORIES 指令加入非标準的庫檔案搜尋路徑。

如果通過 TARGET_LINK_LIBRARIES 為庫或可執行二進制加入庫連結。

以及如何連結到靜态庫。

關于CMake中的一些常用變量:

(1)CMAKE_SOURCE_DIR , PROJECT_SOURCE_DIR ,_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交流群,一起交流分享! 投稿或聯系群主郵箱:[email protected]原創不易,轉載請聯系群主,注明出處

CMake結合PCL庫學習(2)