如何在QT中用cmake和qmake编译PCL程序

来源:互联网 发布:聚宝盆手机计划软件 编辑:程序博客网 时间:2024/06/02 07:27

up主,今天十分蛋疼,因为姿势欠缺,续航时间太有限,这次吃过午饭回来赶紧水一篇,要不然就睡着了,也给这个4月画一个完美的冒号(表示开始了…)
今天介绍如何用qmake,配置qt中的pcl工程,以便可以顺利编译运行

大家都知道,qt工程有一个.pro文件,当然如果你建立了一个非qt工程就不会有(这句好像是废话)
我们来看一下.pro的写法(仅针对部分用法)

#-------------------------------------------------## Project created by QtCreator 2015-04-01T01:21:16##-------------------------------------------------QT       += coreQT       -= guiTARGET = lidar_PCDCONFIG   += consoleCONFIG   -= app_bundleTEMPLATE = appSOURCES += main.cpp \    readlidar.cpp \    pointstopcd.cppHEADERS += \    readlidar.h \    pointstopcd.hLIBS += \# pcl        -L/usr/local/lib \        -lpcl_io -lpcl_common \ # boost        -L/usr/lib/x86_64-linux-gnu \        -lboost_system -lboost_filesystem \INCLUDEPATH +=/usr/include/pcl-1.7/ \              /usr/include/eigen3 \

是不是很容易懂,QT +=core config += console 说明这是一个qtconsole工程,没有用到gui,因此 QT-=gui,如果是一个widget或者ui基类,mainwindow,那么qt+=gui
TARGET是目标工程的名称,下面的SOURCES HEADERS 都是工程里的文件,注意写法。LIBS 是配置工程用到的静态库动态库的路径以及库名。
例如这里用到了boost里的libboost_system.so 它在路径
/usr/lib/x86_64-linux-gnu
因此这里-L/usr/lib/x86_64-linux-gnu 大写的L代表路径
而库名则写成-lboost_system, lib省略了,只留下了-l, 请注意
INCLUDEPATH用来配置项目中外部头文件的搜索路径,这里如果路径是多个的话,记得每行末尾用 ‘\’ 割开,同时下一行直接黏上就哦了

通过上述方法,对.pro文件进行修改,可以让qmake来编译生成makefie,代替PCL cosole程序生成的CMakeList,不过qt也可以建立CMake工程,这样就可以在qtcreator里生成的CMakelist进行配置,下面我们来看一下对应的CMakeList应该怎么写(非常简单 >^<)

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)project(lidar_PCD)find_package(PCL 1.7 REQUIRED Qt4 COMPONENTS QtCore REQUIRED)include_directories(${PCL_INCLUDE_DIRS})link_directories(${PCL_LIBRARY_DIRS})add_definitions(${PCL_DEFINITIONS})add_executable(lidar_PCD main.cpp readlidar.cpp pointstopcd.cpp readlidar.h pointstopcd.h)target_link_libraries (lidar_PCD ${PCL_LIBRARIES})不解释了,因为很容易懂。。。主要是我也不太会,这是copy的官网demo里的第一个是cmake的版本约束project()确定了工程名称,这里是lider_PCD, 以后可以通过${PCL_PROJECT}引用find_package(),需要包含的模块组件,这里是PCL 1.7 REQUIRE,表示包含所有PCL组件,如果想指定模块组件,就用COMPONENTS 模块名称 geninclude_directories(${PCL_INCLUDE_DIRS}) pcl头文件路径配置link_directories(${PCL_LIBRARY_DIRS}) pcl链接路径配置add_definitions(${PCL_DEFINITIONS}) pcl所需要的预处理器定义和编译器标志这些宏定义都是pcl预留的,咱也可以用SET(VAR_NAME var_value),来设置自定义变量名,下面就可以引用了如下例:SET(SEPC_INCLUDE_PATH /usr/local/include/.../...)这里定义了一个名为SEPC_INCLUDE_PATH的宏定义变量假设下面的CmakeLists就可以用include_directories(${SEPC_INCLUDE_PATH})来包含进来了注意要加${}上面的宏定义不能省。他们是cmake从pcl目录中自动找到的会自动设置add_executable(lidar_PCD main.cpp readlidar.cpp pointstopcd.cpp readlidar.h pointstopcd.h)这里.h 文件可以不写到add_executable里,但是要在include_dirs都包含这里有个指令要介绍一下就是:aux_source_directory(dir VAR_NAME)作用是发现当前目录下所有的源码文件(名称,包含类型)如下:aux_source_directory(. SRC_LIST)target_link_libraries (lidar_PCD ${PCL_LIBRARIES}) 将刚刚配置的头文件,库文件搜索路径告诉链接器,让链接器链接用到的库,这里是由${PCL_LIBRARIES}指示,如果需要链接多个库,请用空格隔开,例如:target_link_libraries (lidar_PCD ${PCL_LIBRARIES} ${QT_LIBRARIES}) 

说明:

另外CMake里的指令时大小写insensitive的, 建议大写

( 我怎么都是小写…好,下面大写 )

调试的时候可以用

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "Message")SEND_ERROR: 错误部分跳过,发送错误信息STATUS: 输出前缀唯一的信息FATAL_ERROR: 致命的错误,立即终止cmake

功能是在终端上输出一段“Message” 的信息.


说的有点粗糙,今天就到这里了,还是困成狗,必须睡觉

0 0