紧接着上一篇文章

对于PCL 库中的各个模块之间是有相互依赖关系的

其中Common模块是最基础的模块,其中是定义各种数据结构的头文件,所以Common这个模块是不需要依赖性响的,但是IO 模块就是需要common和Octree两大模块的支持,这时候应该怎么引用他们的依赖项呢,这里就需要讲解如何让构建静态库与动态库了,那么静态库和动态库一般是提供各种函数以供其他编程算法的实现,

这里首先给一个简单的说明建立一个工程文件需要的CMAKE建立的方式“

(1)新建一个文件夹HEllo_cmake文件

(2)首先建立include 文件建立头文件libHelloCMAKE.h文件:

#ifndef LIBHELLOCMAKE_H_
#define LIBHELLOCMAKE_H_
// 上面的宏定义是为了防止重复引用这个头文件而引起的重定义错误void printHello();#endif

3)建立src文件,新建libHelloCMAKE.cpp,该函数就是实现.h文件中申明的void printHello(); 函数,具体内容如下:

//这是一个实现代码功能的函数
#include <iostream>
using namespace std;
void printHello()
{cout<<"Hello CMake"<<endl;
}

(4)新建main文件,该文件是是建立主函数 实现我们的上面写的打印hello CMAKE函数,新建useHello.cpp文件 :

#include "libHelloCMAKE.h"// 使用 libHelloCMAKE.h 中的 printHello() 函数
int main( int argc, char** argv )
{printHello();return 0;
}

(4)接下来就是如果写cmake文件进行编译生成动态链接库,以及写一个函数应用我们生成的链接库.
我们在hello_cmake文件中新建CMakeList.txt文件,文件内容如下:

# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )# 声明一个 cmake 工程
project( Hellocmake)set (CMAKE_CXX_COMPILER "g++")
# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )
#set (CMAKE_BUILD_TYPE "Release")
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )#这里是添加cmake其他依赖库的cmake 文件
#list (APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)#生成可执行文件的路径
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)
#设置生成的可链接的库路径
set (LIBRAYR_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)
#set( THIRD_PARTY_LIBS
#   )include_directories (${PROJECT_SOURCE_DIR}/include)
#添加有cmake的二级文件
add_subdirectory(src)
add_subdirectory(main)

(5)在src中同样新建CMakeLists.txt 文件内容为:

#############编译一个动态链接库###################
# 添加一个库
add_library( hello libHelloCMAKE.cpp )
# 共享库
add_library( hello_shared SHARED libHelloCMAKE.cpp )

(6)在main文件下新建CMakeLists.txt ,文件内容:

# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( useHello useHello.cpp )
# 将库文件链接到可执行程序上
target_link_libraries( useHello hello_shared )
#或者可以写为
#target_link_libraries(useHello libhello_shared.so)

(7)这时候一个工程文件就已经建立了,我们需要编译即可:
在hello_cmake文件下执行以下命令:
mkdir build
cd build
cmake …
make
执行的结果:

可以看到我们已经生成了动态的链接库文件libhello_shared.so
以及静态链接库libhello.a
可以直接运行程序

如何通过 INCLUDE_DIRECTORIES 指令加入非标准的头文件搜索路径。
如何通过 LINK_DIRECTORIES 指令加入非标准的库文件搜索路径。
如果通过 TARGET_LINK_LIBRARIES 为库或可执行二进制加入库链接。
以及如何链接到静态库。

关于CMake中的一些常用变量:

(1)CMAKE_SOURCE_DIR , PROJECT_SOURCE_DIR ,_SOURCE_DIR 都代表这工程的顶层目录

(2)CMAKE_CURRENT_SOURCE_DIR 指的是当前处理的 CMakeLists.txt 所在的路径

(3)CMAKE_CURRENT_LIST_FILE 输出调用这个变量的 CMakeLists.txt 的完整路径

(4)CMAKE_MODULE_PATH
这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己 编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理
CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设 置一下。
比如 SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) 这时候你就可以通过 INCLUDE 指令来调用自己的模块了。这种定义CMAKE模块的方式在PCL中也是有的
(5)EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。
(6)ROJECT_NAME 返回通过 PROJECT 指令定义的项目名称。

CMAKE中调用环境变量的方式
(1) 设置环境变量的方式是: SET(ENV{变量名} 值) 比如上面的例子就有用到
(2)CMAKE_INCLUDE_CURRENT_DIR 自动添加 CMAKE_CURRENT_BINARY_DIR 和 CMAKE_CURRENT_SOURCE_DIR 到当前处理
的 CMakeLists.txt。相当于在每个 CMakeLists.txt 加入: INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

CMAKE中的开关选项
(1)CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,用来控制 IF ELSE 语句的书写方式
(2)BUILD_SHARED_LIBS 这个开关用来控制默认的库编译方式,如果不进行设置,使用 ADD_LIBRARY 并没有指定库 类型的情况下,默认编译生成的库都是静态库。 如果 SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。
(3)CMAKE_C_FLAGS 设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
(4)CMAKE_CXX_FLAGS 设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
这是一个简单的建立CMake的工程教程,接下来将会详细介绍PCL 中的更多内容

以上内容如有错误或者需要补充的,请留言!同时欢迎大家关注微信公众号,积极分享投稿,做到大家一起分享,拒绝只做个伸手党!或者加入3D视觉微信群或QQ交流群,一起交流分享! 投稿或联系群主邮箱:dianyunpcl@163.com原创不易,转载请联系群主,注明出处

CMake结合PCL库学习(2)相关推荐

  1. CMake结合PCL库学习(1)

    经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...

  2. PCL库学习笔记(PCL Visualizer)

    本文展示了PCL Visualizer的几种基本用法.代码的主体是点云库提供的源代码.由于其是由cmake进行编译,有输入参数的选择问题.为了方便VS的调试运行过程,将其中的输入接口进行了修改: 代码 ...

  3. PCL库学习(8)_点云调参系统之环境搭建QT5.7.0+VS2013+PCL1.8.0配置

    功能1:单帧点云的加载与可视化: 功能2:多帧点云的加载与可视化:(未实现,可提供源码) 功能3:点云滤波,包括但不限于直通滤波.体素栅格滤波.半径滤波等等: 功能4:地面点检测,包括但不限于Lego ...

  4. PCL库学习笔记——使用变换矩阵变换点云

    下面的代码通过两种方式生成了变换矩阵,并执行了变换及可视化. #include <iostream>#include <pcl/io/pcd_io.h> #include &l ...

  5. [转载] PCL库相关资源的查找和使用Tip

    前言 学习PCL库的两个月左右时间里,从刚开始的无从下手到慢慢地摸清一些门道,走了很多弯路,也遇到过很多困惑,逐渐有了一些如何查找与利用PCL库学习资源的心得.所以把这些心得记录下来,一是为了给自己以 ...

  6. 学习PCL库你应该知道的C++特性

    要学会PCL首先要对C++进行学习,所以这里我们首先对PCL库的代码中常见的C++的技巧进行整理和概述,并且对其中的难点进行细化讲解.首先我们搞清楚PCL库的文件形式.是一个以CMake构建的项目,库 ...

  7. 3D视觉学习计划之PCL库的基础知识

    3D视觉学习计划之PCL库的基础知识 一.PCL库的概述 PCL是一个大型跨平台开源C++编程库,它在吸收了前人点云相关研究基础上建立起来,实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取. ...

  8. 《PCL点云库学习VS2010(X64)》Part 34 旋转平移矩阵用法

    <PCL点云库学习&VS2010(X64)>Part 34 旋转平移矩阵用法 1.变换与投影矩阵讲解: https://en.wikipedia.org/wiki/Transfor ...

  9. 《PCL点云库学习VS2010(X64)》Part 45 点云压缩算法—扫描线(DouglasPeuckerAlgorithm)

    <PCL点云库学习&VS2010(X64)>Part 45 点云压缩算法-扫描线(DouglasPeuckerAlgorithm) 道格拉斯-普克算法主要应用有点云滤波.点云压缩. ...

最新文章

  1. AI大牛纷纷离职!2021大厂AI Lab现状盘点,网友:名存实亡
  2. matlab丢失icuuc54,icuuc56.dll下载|
  3. AndroidManifest.xml文件剖析
  4. 安装指定版本的minikube
  5. jquery 立体走马灯_jQuery简单的文字跑马灯特效
  6. Atitit 硬件 软件 的开源工作 差异对比
  7. Flask知识点查阅
  8. 武汉大学c语言实验报告模板,武汉大学C语言程序设计第3讲(2012级).ppt
  9. 解决 Beyond Compare 3 许可证密钥被撤销
  10. bottle框架学习(四)之模版进阶使用
  11. PIE调用Python获得彩色直方图
  12. PCL中的点云分割算法
  13. 真格基金王强:判断一个项目好坏,我会做五个思考!
  14. 指针万用表使用欧姆档测量电容器时偏转
  15. android前端开发
  16. Windows系统服务器如何架设网站
  17. 拟合函数未知数个数与用于拟合的序列点数的关系
  18. input-group两侧添加额外元素
  19. Python中的对象赋值和浅拷贝,深拷贝
  20. 沟通的艺术:看人入里,看出人外 - part 5

热门文章

  1. Web Service 安全性解决方案(SOAP篇)
  2. postgreSQL外键引用查询 查询外键被那些表占用
  3. IP白名单添加了当前IP,获取access_token时依然报出错误码40164的坑
  4. 生成器、迭代器的区别?
  5. python3:利用SMTP协议发送QQ邮件+附件
  6. Docker | Docker技术基础梳理(五) - Docker网络管理
  7. github上传本地代码失败
  8. class function或class procedure是什么意思
  9. .NET 4.0 Interop新特性ICustomQueryInterface (转载)
  10. usaco Network of Schools