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 变量还可以这样理解!」
更多好的文章会优先在里面不定期分享!打开微信客户端,扫描下方二维码即可关注!
Sophus库CMakeLists.txt内容详解笔记的更多相关文章
- Sopus库中FindEigen3.cmake内容详解笔记
FindEigen3.cmake: # - Try to find Eigen3 lib # Once done this will define # # EIGEN3_FOUND - system ...
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- TCP-IP详解笔记7
TCP-IP详解笔记7 TCP: 传输控制协议(初步) 使用差错校正码来纠正通信问题, 自动重复请求(Automatic Repeat Request, ARQ). 分组重新排序, 分组复制, 分组丢 ...
- TCP-IP详解笔记4
TCP-IP详解笔记4 系统配置: DHCP和自动配置 每台主机和路由器需要一定的配置信息,配置信息用于为系统指定本地名称,及为接口指定标识符(如IP地址). 提供或使用各种网络服务,域名系统(DNS ...
- TCP-IP详解笔记3
TCP-IP详解笔记3 地址解析协议 IP协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作. 网络层软件使用的地址和底层网络硬件使用的地址之间进行转换. 对于TCP/IP网络,地址解析协议( ...
- http详解笔记
http详解笔记 http,(HyperText Transfer Protocol),超文本传输协议,亦成为超文本转移协议 通常使用的网络是在TCP/IP协议族的基础上运作的,HTTP属于它的一 ...
- TCP-IP详解笔记8
TCP-IP详解笔记8 TCP超时与重传 下层网络层(IP)可能出现丢失, 重复或丢失包的情况, TCP协议提供了可靠的数据传输服务. TCP启动重传操作, 重传尚未确定的数据. 基于时间重传. 基于 ...
- TCP-IP详解笔记6
TCP-IP详解笔记6 用户数据报协议和IP分片 UDP是一种保留消息边界的面向数据报的传输层协议. 不提供差错纠正, 队列管理, 重复消除, 流量控制和拥塞控制. 提供差错检测, 端到端(end-t ...
随机推荐
- 1058 选择题 (20 分)C语言
批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100),分别是学生人数和多选题的个 ...
- 动态规划之抢劫问题-LT213
找到大问题和小问题之间共有的特性,列出一定的状态转移规律,然后设计满足条件的小问题解决方案,最后凭借记忆中的中间值快速求出最终解 动态规划问题的复杂性在于你永远不知道下一个题目中的状态是什么,有什么样 ...
- forkjoin及其性能分析,是否比for循环快?
最近看了网上的某公开课,其中有讲到forkjoin框架.在这之前,我丝毫没听说过这个东西,很好奇是什么东东.于是,就顺道研究了一番. 总感觉这个东西,用的地方很少,也有可能是我才疏学浅.好吧,反正问了 ...
- Spring Boot2 系列教程 (三) | 使用 LomBok 提高开发效率
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 上周去了开年会,去的地方是温泉度假村.老实说,我是无感的,90% 是因为没中奖(老板太抠,两百人只抽三个奖),10 ...
- 求二叉树的深度,从根节点到叶子节点的最大值,以及最大路径(python代码实现)
首先定义一个节点类,包含三个成员变量,分别是节点值,左指针,右指针,如下代码所示: class Node(object): def __init__(self, value): self.value ...
- background-position和position
1.background-position:表示背景定位的属性.描述属性值时,有两种方式:一是像素描述:而是单位描述. (1)像素描述: 格式如下: background-position:向右偏移量 ...
- Unity3D游戏开发培训
Unity3D游戏开发培训 作者:Jesai 时间:2017-01-08 修改:2017-01-09 12:36:15 1 项目的构成 图1-1 如图1-1所示,Unity3D的项目构 ...
- 洛谷 P1658 购物
题目链接 题目描述 你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个.为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值. 题目分析 题目要求组合出1到X之间的任意值 ...
- ii
char a[10], b[10], c[10], d[10],e[10],f[10],g[10],h[10]; scanf("%s %s %s %s", a, b, c, d); ...
- 最强PostMan使用教程
最近需要测试产品中的REST API,无意中发现了PostMan这个chrome插件,把玩了一下,发现postman秉承了一贯以来google工具强大,易用的特质.独乐乐不如众乐乐,特此共享出来给大伙 ...