1. 程式人生 > >CMakeList.txt在大型檔案應用(以前端為例)

CMakeList.txt在大型檔案應用(以前端為例)

基本的CMakeLists.txt並不難,主要有生成庫、生成執行檔案、連結二者以及找庫、找標頭檔案、生成執行檔案、連結庫和執行檔案兩種方法組成。

但是遇到大型庫的編寫,目標是生成一個新的大型庫myslam,生成執行檔案、連結二者。需要提前宣告生成執行檔案在bin,庫在lib中,並把OPenCV、Sophus這些庫整合到一個大型的第三方庫THIRD_PARTY_LIBS中,供後面的target_link_libraries(myslam ${THIRD_PARTY_LIBS})用。myslam中包括兩部分:frame.cpp、mappoint.cpp、map.cpp等+第三方庫THIRD_PARTY_LIBS


一、簡單的

1)從頭開始:(生成庫、生成執行檔案、連結二者)

CMakeLists.txt

add_library( hello_shared SHARED libHelloSLAM.cpp ) # 生成庫

add_executable( useHello useHello.cpp ) #執行檔案

target_link_libraries( useHello hello_shared ) # 連結庫到執行檔案上

1、先生成庫檔案libhello_shred.so,需要libHelloSLAM.cpp和add_library(hello_shared SHARED libHelloSLAM.cpp)

2、之後要建立標頭檔案libhellSLAM.h告訴如何呼叫庫裡的函式,需要把庫連線到可執行檔名中 target_link_libraried(useHello hello_shared)

3、主函式useHello.cpp使用標頭檔案

2)利用現成的庫:

只需要建立標頭檔案,說明怎麼使用即可。

3)大型的庫只需修改CMakeList.txt即可(找庫、新增標頭檔案、生成執行檔案、連結庫和執行檔案

標頭檔案也已經建立好了,只需找到庫然後加入標頭檔案即可使用

CMakeLists.txt

find_package( OpenCV REQUIRED )                            #尋找OpenCV庫
include_directories

( ${OpenCV_INCLUDE_DIRS})  #新增標頭檔案 

add_executable( imageBasics imageBasics.cpp)    #新增可執行檔案
target_link_libraries( imageBasics ${OpenCV_LIBS} ) #連結OpenCV庫


二、大型檔案

1、我們的目標是:

寫一個VO庫myslam庫,這個庫需要自己寫在include裡的.cpp 五大類以及一些第三方庫(Eigen、OpenCV、Sophus、G2O)。 

之後需要測試程式生成執行檔案run_vo,最後連結myslam庫的run_vo,跑效果。

add_library( myslam SHARED

                      frame.cpp mappoint.cpp map.cpp camera.cpp config.cpp

                       g2o_types.cpp visual_odometry.cpp )

add_executable( run_vo run_vo.cpp ) 

target_link_libraries( run_vo myslam )


2、步驟:

根目錄的CMakeList.txt生成新的第三方庫THIRD_PARTY_LIBS,需要include所有第三方庫標頭檔案,並set路徑引數。

       很多第三方庫檔案則被整合成了一個大的THIRD_PARTY_LIBS路徑變數,以備後面src中生成myslam用target_link_libraries.

src中的CMakeList.txt中生成myslam庫,需要五大類.cpp連結到上層定義的THIRD_PARTY_LIBS庫檔案路徑。 

test中的CMakeList.txt中就是簡單的生成可執行檔案run_vo,並將原始檔連結到我們寫的myslam庫檔案上。

接下來,對這三個CMakeList.txt分別進行介紹:

先來看根目錄下的這個CMakeList.txt:

#定義需求版本和工程名稱#
cmake_minimum_required(VERSION 2.8)
project (myslam)

#cmake相關的一些設定#
set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )

#新增cmake_modules到CMAKE_MODULE_PATH路徑列表中和
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
#設定可執行檔案與庫檔案的輸出路徑bin、lib
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )

############### 找第三方庫和新增標頭檔案 ######################
# Eigen
include_directories( "/usr/include/eigen3" )
# OpenCV
find_package( OpenCV 3.1 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Sophus 
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
# G2O
find_package( G2O REQUIRED )
include_directories( ${G2O_INCLUDE_DIRS} )

#根據庫檔案路徑引數生成第三方庫THIRD_PARTY_LIBS
set( THIRD_PARTY_LIBS 
    ${OpenCV_LIBS}
    ${Sophus_LIBRARIES}
    g2o_core g2o_stuff g2o_types_sba
)
############### 自己寫的標頭檔案 ######################
include_directories( ${PROJECT_SOURCE_DIR}/include )

#增加子目錄#
add_subdirectory( src )
add_subdirectory( test )

然後src中的CMakeList.txt:

#由此一堆生成自己寫的一個庫檔案,名為myslam,這個庫是連結在第三方庫基礎上的。
add_library( myslam SHARED
    frame.cpp
    mappoint.cpp
    map.cpp
    camera.cpp
    config.cpp
    g2o_types.cpp
    visual_odometry.cpp
)

# myslam庫需要連結上方定義好的第三方庫,${THIRD_PARTY_LIBS}路徑引數。
target_link_libraries( myslam
    ${THIRD_PARTY_LIBS}
)

然後test中的CMakeList.txt:

 #最終到這裡,新增可執行檔案
add_executable( run_vo run_vo.cpp )
#可執行檔案連結在自己寫的庫檔案myslam上#
target_link_libraries( run_vo myslam )

註解:

1、當前目錄名稱為 {PROJECT_SOURCE_DIR},路徑表達為 ${PROJECT_SOURCE_DIR}

2、list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )這句的意思也就很明瞭了,就是將工程根目錄下的cmake_modules資料夾路徑,新增到CMAKE_MODULE_PATH路徑列表中。

3、add_subdirectory 命令。我們的專案各個子專案都在一個總的專案根目錄下,該命令可以將指定的資料夾加到build任務列表中。