zoukankan      html  css  js  c++  java
  • 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 变量还可以这样理解!

    更多好的文章会优先在里面不定期分享!打开微信客户端,扫描下方二维码即可关注!

  • 相关阅读:
    菜鸟涂鸦作品展_No.29
    菜鸟涂鸦作品展_No.27
    菜鸟涂鸦作品展_No.26
    关注的前沿动态
    货币转换
    第二周总结
    老鼠
    71 打印沙漏
    学习总结0.0
    第五周作业
  • 原文地址:https://www.cnblogs.com/newneul/p/8367421.html
Copyright © 2011-2022 走看看