CMake结合PCL库学习(2)
緊接著上一篇文章
對(duì)于PCL 庫中的各個(gè)模塊之間是有相互依賴關(guān)系的
其中Common模塊是最基礎(chǔ)的模塊,其中是定義各種數(shù)據(jù)結(jié)構(gòu)的頭文件,所以Common這個(gè)模塊是不需要依賴性響的,但是IO 模塊就是需要common和Octree兩大模塊的支持,這時(shí)候應(yīng)該怎么引用他們的依賴項(xiàng)呢,這里就需要講解如何讓構(gòu)建靜態(tài)庫與動(dòng)態(tài)庫了,那么靜態(tài)庫和動(dòng)態(tài)庫一般是提供各種函數(shù)以供其他編程算法的實(shí)現(xiàn),
這里首先給一個(gè)簡單的說明建立一個(gè)工程文件需要的CMAKE建立的方式“
(1)新建一個(gè)文件夾HEllo_cmake文件
(2)首先建立include 文件建立頭文件libHelloCMAKE.h文件:
#ifndef LIBHELLOCMAKE_H_
#define LIBHELLOCMAKE_H_
// 上面的宏定義是為了防止重復(fù)引用這個(gè)頭文件而引起的重定義錯(cuò)誤void printHello();#endif
3)建立src文件,新建libHelloCMAKE.cpp,該函數(shù)就是實(shí)現(xiàn).h文件中申明的void printHello(); 函數(shù),具體內(nèi)容如下:
//這是一個(gè)實(shí)現(xiàn)代碼功能的函數(shù)
#include <iostream>
using namespace std;
void printHello()
{cout<<"Hello CMake"<<endl;
}
(4)新建main文件,該文件是是建立主函數(shù) 實(shí)現(xiàn)我們的上面寫的打印hello CMAKE函數(shù),新建useHello.cpp文件 :
#include "libHelloCMAKE.h"// 使用 libHelloCMAKE.h 中的 printHello() 函數(shù)
int main( int argc, char** argv )
{printHello();return 0;
}
(4)接下來就是如果寫cmake文件進(jìn)行編譯生成動(dòng)態(tài)鏈接庫,以及寫一個(gè)函數(shù)應(yīng)用我們生成的鏈接庫.
我們?cè)趆ello_cmake文件中新建CMakeList.txt文件,文件內(nèi)容如下:
# 聲明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )# 聲明一個(gè) cmake 工程
project( Hellocmake)set (CMAKE_CXX_COMPILER "g++")
# 設(shè)置編譯模式
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)#生成可執(zhí)行文件的路徑
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
#設(shè)置生成的可鏈接的庫路徑
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的二級(jí)文件
add_subdirectory(src)
add_subdirectory(main)
(5)在src中同樣新建CMakeLists.txt 文件內(nèi)容為:
#############編譯一個(gè)動(dòng)態(tài)鏈接庫###################
# 添加一個(gè)庫
add_library( hello libHelloCMAKE.cpp )
# 共享庫
add_library( hello_shared SHARED libHelloCMAKE.cpp )
(6)在main文件下新建CMakeLists.txt ,文件內(nèi)容:
# 添加一個(gè)可執(zhí)行程序
# 語法:add_executable( 程序名 源代碼文件 )
add_executable( useHello useHello.cpp )
# 將庫文件鏈接到可執(zhí)行程序上
target_link_libraries( useHello hello_shared )
#或者可以寫為
#target_link_libraries(useHello libhello_shared.so)
(7)這時(shí)候一個(gè)工程文件就已經(jīng)建立了,我們需要編譯即可:
在hello_cmake文件下執(zhí)行以下命令:
mkdir build
cd build
cmake …
make
執(zhí)行的結(jié)果:
可以看到我們已經(jīng)生成了動(dòng)態(tài)的鏈接庫文件libhello_shared.so
以及靜態(tài)鏈接庫libhello.a
可以直接運(yùn)行程序
如何通過 INCLUDE_DIRECTORIES 指令加入非標(biāo)準(zhǔn)的頭文件搜索路徑。
如何通過 LINK_DIRECTORIES 指令加入非標(biāo)準(zhǔn)的庫文件搜索路徑。
如果通過 TARGET_LINK_LIBRARIES 為庫或可執(zhí)行二進(jìn)制加入庫鏈接。
以及如何鏈接到靜態(tài)庫。
關(guān)于CMake中的一些常用變量:
(1)CMAKE_SOURCE_DIR , PROJECT_SOURCE_DIR ,_SOURCE_DIR 都代表這工程的頂層目錄
(2)CMAKE_CURRENT_SOURCE_DIR 指的是當(dāng)前處理的 CMakeLists.txt 所在的路徑
(3)CMAKE_CURRENT_LIST_FILE 輸出調(diào)用這個(gè)變量的 CMakeLists.txt 的完整路徑
(4)CMAKE_MODULE_PATH
這個(gè)變量用來定義自己的 cmake 模塊所在的路徑。如果你的工程比較復(fù)雜,有可能會(huì)自己 編寫一些 cmake 模塊,這些 cmake 模塊是隨你的工程發(fā)布的,為了讓 cmake 在處理
CMakeLists.txt 時(shí)找到這些模塊,你需要通過 SET 指令,將自己的 cmake 模塊路徑設(shè) 置一下。
比如 SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) 這時(shí)候你就可以通過 INCLUDE 指令來調(diào)用自己的模塊了。這種定義CMAKE模塊的方式在PCL中也是有的
(5)EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 分別用來重新定義最終結(jié)果的存放目錄,前面我們已經(jīng)提到了這兩個(gè)變量。
(6)ROJECT_NAME 返回通過 PROJECT 指令定義的項(xiàng)目名稱。
CMAKE中調(diào)用環(huán)境變量的方式
(1) 設(shè)置環(huán)境變量的方式是: SET(ENV{變量名} 值) 比如上面的例子就有用到
(2)CMAKE_INCLUDE_CURRENT_DIR 自動(dòng)添加 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR 到當(dāng)前處理
的 CMakeLists.txt。相當(dāng)于在每個(gè) CMakeLists.txt 加入: INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
CMAKE中的開關(guān)選項(xiàng)
(1)CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,用來控制 IF ELSE 語句的書寫方式
(2)BUILD_SHARED_LIBS 這個(gè)開關(guān)用來控制默認(rèn)的庫編譯方式,如果不進(jìn)行設(shè)置,使用 ADD_LIBRARY 并沒有指定庫 類型的情況下,默認(rèn)編譯生成的庫都是靜態(tài)庫。 如果 SET(BUILD_SHARED_LIBS ON)后,默認(rèn)生成的為動(dòng)態(tài)庫。
(3)CMAKE_C_FLAGS 設(shè)置 C 編譯選項(xiàng),也可以通過指令 ADD_DEFINITIONS()添加。
(4)CMAKE_CXX_FLAGS 設(shè)置 C++編譯選項(xiàng),也可以通過指令 ADD_DEFINITIONS()添加。
這是一個(gè)簡單的建立CMake的工程教程,接下來將會(huì)詳細(xì)介紹PCL 中的更多內(nèi)容
以上內(nèi)容如有錯(cuò)誤或者需要補(bǔ)充的,請(qǐng)留言!同時(shí)歡迎大家關(guān)注微信公眾號(hào),積極分享投稿,做到大家一起分享,拒絕只做個(gè)伸手黨!或者加入3D視覺微信群或QQ交流群,一起交流分享! 投稿或聯(lián)系群主郵箱:dianyunpcl@163.com原創(chuàng)不易,轉(zhuǎn)載請(qǐng)聯(lián)系群主,注明出處
總結(jié)
以上是生活随笔為你收集整理的CMake结合PCL库学习(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMake结合PCL库学习(1)
- 下一篇: PCL点云配准(3)