热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CMake结合PCL库学习(2)

p{margin-bottom:0.1in;direction:ltr;color:rgb(0,0,0);line-height:120%;text-align:justif

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

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


这里首先给一个简单的说明建立一个工程文件需要的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 
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

  原创不易,转载请联系群主,注明出处。

Share together, up together

                                                                                                                          视觉点云

                                                                                                     

 

 


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
author-avatar
禾漾啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有