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 變量還可以這樣理解!」
更多好的文章會優先在里面不定期分享!打開微信客戶端,掃描下方二維碼即可關注!