Sophus庫CMakeLists.txt內容詳解筆記


CMakeLists.txt:

SET(PROJECT_NAME Sophus)

PROJECT(${PROJECT_NAME})
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

SET (CMAKE_VERBOSE_MAKEFILE ON)

IF( NOT CMAKE_BUILD_TYPE )
   SET( CMAKE_BUILD_TYPE Release )
ENDIF()

IF (CMAKE_COMPILER_IS_GNUCXX )
#設置編譯選項參數
   SET(CMAKE_CXX_FLAGS_DEBUG  "-O0 -g")
   SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG ")

  ADD_DEFINITIONS("-Wall -Werror -Wno-unused-variable
                   -Wno-unused-but-set-variable -Wno-unknown-pragmas ")
ENDIF()

################################################################################
# Add local path for finding packages, set the local version first
set( CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" )
#備注:表示將后面的 "" 里面的內容添加到CMAKE_MODULE_PATH列表里,相當於CMAKE_MODULE_PATH路徑又多了一個,但是對於自己CMake安裝目錄來說,指定安裝到了/usr/local 中了所以CMAKE_ROOT 表示/usr/local,所以這個目錄下面並沒有Modules這個文件夾。
#參考:https://cmake.org/cmake/help/v3.0/command/list.html
list( APPEND CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" )

################################################################################
# Create variables used for exporting in SophusConfig.cmake
set( Sophus_LIBRARIES "" )
set( Sophus_INCLUDE_DIR ${PROJECT_SOURCE_DIR} )

################################################################################

#SET (INCLUDE_DIRS "../eigen3.1/")
#上面已經設置了這個路徑了CMAKE_MODULE_PATH,因為Sophus本身要使用Eigen庫,可以發現在find_package時會找到cmake_modules里面的FindEigen3.cmake並執行這個文件。去找到真正的Eigen所在的目錄。
find_package( Eigen3 REQUIRED )
INCLUDE_DIRECTORIES( ${EIGEN3_INCLUDE_DIR} )
#設置Sophus的頭文件路徑 包含了Eigen庫和自己本身的頭文件路徑
SET( Sophus_INCLUDE_DIR ${Sophus_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR} )

SET (SOURCE_DIR "sophus")
SET (CLASSES  so2
              se2
              se3
              so3
              scso3
              sim3
)

#移除SOURCES代表的CMake變量(normal variables and cache variables):f <value> is not specified then the variable is removed instead of set. See also: the unset() command.
#參考地址:https://cmake.org/cmake/help/v3.0/command/set.html
SET (SOURCES)

#將CLASSES中的那些so2 se2..循環遍歷一遍 執行下面的list命令,就是將這幾個文件加入到SOURCES變量中。
#FOREACH表示循環的意思 循環執行在ENDFOREACH(class)之間的所有命令
#參考:http://blog.csdn.net/lcj_cjfykx/article/details/38186151
FOREACH(class ${CLASSES})
  LIST(APPEND SOURCES ${SOURCE_DIR}/${class}.cpp ${SOURCE_DIR}/${class}.h)
ENDFOREACH(class)

#鏈接PROJECT_NAME LIBS 庫文件
LINK_LIBRARIES (${PROJECT_NAME} ${LIBS})
set( Sophus_LIBRARIES ${Sophus_LIBRARIES} ${LIBS} )
#包含頭文件目錄
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
#將上面的SOURCES包含的.cpp .h文件變為一個文件的libSophus.so共享庫 在build目錄中
ADD_LIBRARY(${PROJECT_NAME} SHARED ${SOURCES})

#增加一系列的可執行文件
ADD_EXECUTABLE(test_so2 sophus/test_so2.cpp)
ADD_EXECUTABLE(test_se2 sophus/test_se2.cpp)
ADD_EXECUTABLE(test_so3 sophus/test_so3.cpp)
ADD_EXECUTABLE(test_scso3 sophus/test_scso3.cpp)
ADD_EXECUTABLE(test_se3 sophus/test_se3.cpp)
ADD_EXECUTABLE(test_sim3 sophus/test_sim3.cpp)
#指令用來控制Makefile 是否構建test目標,涉及工程所有目錄。語法很簡單,沒有任何參數
#一般這個指令在主CMakeLists.txt文件中
ENABLE_TESTING()

#Makefile會構建上面可執行文件對應的目標,前一個參數是自己隨便起的名字,后面是名字是上面的可執行文件。
#后面還可以添加傳遞給可執行文件的參數
#參考:https://www.kancloud.cn/itfanr/cmake-practice/82990
ADD_TEST(test_so2 test_so2)
ADD_TEST(test_se2 test_se2)
ADD_TEST(test_so3 test_so3)
ADD_TEST(test_scso3 test_scso3)
ADD_TEST(test_se3 test_se3)
ADD_TEST(test_sim3 test_sim3)

##############################################################################
# Get full library name
#在 ${PROJECT_NAME}中獲取LOCATION屬性值,如果找到了 就會把屬性值給FULL_LIBRARY_NAME
#沒有找到的話FULL_LIBRARY_NAME就會被設置為NOTFOUND 
#參考:https://cmake.org/cmake/help/v3.5/command/get_target_property.html
GET_TARGET_PROPERTY( FULL_LIBRARY_NAME ${PROJECT_NAME} LOCATION )
set( Sophus_LIBRARIES ${Sophus_LIBRARIES} ${FULL_LIBRARY_NAME} )
set( Sophus_LIBRARY_DIR ${PROJECT_BINARY_DIR} )

################################################################################
# Create the SophusConfig.cmake file for other cmake projects.
#將前面路徑下的文件 復制到 后面路徑里並且修改名字為SophusConfig.cmake
#參考:https://cmake.org/cmake/help/v3.0/command/configure_file.html
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/SophusConfig.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/SophusConfig.cmake @ONLY IMMEDIATE )
#導出當前的編譯目錄build的路徑到CMake注冊表中,就是在home目錄下的隱藏的.cmake文件夾中的packages中建立一個Sophus文件夾 里面有存儲在編譯Sophus庫的時候,build的路徑,該路徑包含SophusConfig.cmake文件。
#當用find_package的時候 ,CMake會按照注冊表中的注冊的路徑自動的都鎖SophusConfig.cmake文件
#所以Sophus這個庫不需要安裝,因為安裝本身僅僅是把SophusConfig.cmake 或者FindSophus.cmake
#文件放在CMake的Modules文件夾下,這個文件夾也是CMake使用find_package自動搜索的路徑之一
#參考:https://cmake.org/cmake/help/v3.0/command/export.html
export( PACKAGE Sophus )

#將當前目錄下的sophus文件夾安裝到${CMAKE_INSTALL_PREFIX}/include下面,
#安裝到的目錄中sophus文件夾中僅僅有.h結尾的。.cpp就不會安裝到那個目錄中,
#但是我這里就沒有這個文件夾,也不知道為什么,搜索也沒有搜索到,但是只要能夠找到SophusConfig.cmake
#就能用include_directories(Sophus_INCLUDE_DIRS)這條語句來包含那個庫,
#可以直接在我們使用的.cpp文件中包含要用的sophus的.h文件。
INSTALL(DIRECTORY sophus DESTINATION ${CMAKE_INSTALL_PREFIX}/include FILES_MATCHING PATTERN "*.h" )

#將Sophus庫安裝到指定的文件夾下面,但是我搜尋了目標文件夾的下面 也沒有找到庫文件。
#但是在SophusConfig.cmake中定義的Sophus_LIBRARIES自動鏈接到了當前目錄中的build目錄下,
#因此在工程只要target_link_libraries(${PROJECT_NAME} ${Sophus_LIBRARIES})也能夠鏈接到庫中。
INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib )

 

歡迎大家關注我的微信公眾號「佛系師兄」,里面有關於 Ceres 以及 OpenCV 等更多技術文章。

比如

反復研究好幾遍,我才發現關於 CMake 變量還可以這樣理解!

更多好的文章會優先在里面不定期分享!打開微信客戶端,掃描下方二維碼即可關注!

 


免責聲明!

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



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