CMake結合PCL庫學習(2)


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

其中Common模塊是最基礎的模塊,其中是定義各種數據結構的頭文件,所以Common這個模塊是不需要依賴性響的,但是IO 模塊就是需要commonOctree兩大模塊的支持,這時候應該怎么引用他們的依賴項呢,這里就需要講解如何讓構建靜態庫與動態庫了,那么靜態庫和動態庫一般是提供各種函數以供其他編程算法的實現,


這里首先給一個簡單的說明建立一個工程文件需要的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

                                                                                                                          視覺點雲

                                                                                                     

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM