在我的项目里面会经常用到比如各种版本的ndt算法库,ndt_cpu/ndt_gpu_ndt_omp,无可避免得会涉及到一些动态库的打包及饮用方法,这里记录一下,并给出打包好的ndt lib库,库的源码来源为Autoware以及开源项目ndt_omp。
CMake 全称是Cross platform Make的简写,是基于Make来实现相关的内容的,换句话说,CMake就是在Make的基础上抽象出来的更高级的框架。这里也总结以下常用的CMake命令。
我们知道,在LInux中,库文件分成静态库和共享库两种,静态库以.a作为后缀,共享库则是以.so结尾,所有库都是函数打包后的集合,区别就在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本 。这里以ndt_omp库为例,来进行生成.so库及引用。
打包ndt_omp动态库 打包 其项目源码地址:
https://github.com/koide3/ndt_omp.git
这个项目结构稍微浏览一下,可以看到ndt_omp库函数及头文件在src/pclomp以及include目录下,apps/align.cpp是作者给出的测试函数,有main。所以打包的时候我们直接考虑src目录下源文件即可。
打开cmakelist.txt文件,可以看到
1 2 3 4 add_library(ndt_omp src/pclomp/voxel_grid_covariance_omp.cpp src/pclomp/ndt_omp.cpp src/pclomp/gicp_omp.cpp)
这里直接修改为
1 2 3 4 add_library(ndt_omp SHARED src/pclomp/voxel_grid_covariance_omp.cpp src/pclomp/ndt_omp.cpp src/pclomp/gicp_omp.cpp)
这样编译项目,即可在/build/devel/lib下面看到生成的libndt_omp.so文件。
引用 新建一个test_omp项目,
将ndt_omp/include文件夹复制过来,里面包含了要用到的头文件。
新建lib文件夹,将打包好的libndt_omp.so文件丢进去,
修改cmakelist.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 find_package(PCL 1.7 REQUIRED) find_package(OpenMP) if (OPENMP_FOUND) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}" ) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}" ) endif ()include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) include_directories(include ) link_directories(lib) add_executable(test_omp src/align.cpp ) target_link_libraries(test_omp ${PCL_LIBRARIES} ndt_omp )
然后我们写main函数测试是否能正常引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/registration/ndt.h> #include <pcl/filters/voxel_grid.h> #include <pcl/visualization/pcl_visualizer.h> #include <pclomp/ndt_omp.h> //头文件保证能找到 #include <iostream> int main (int argc, char ** argv) { std ::cout << "--- pcl::NDT ---" << std ::endl ; std ::vector <int > num_threads = {1 , omp_get_max_threads()}; std ::vector <std ::pair<std ::string , pclomp::NeighborSearchMethod>> search_methods = { {"KDTREE" , pclomp::KDTREE}, {"DIRECT7" , pclomp::DIRECT7}, {"DIRECT1" , pclomp::DIRECT1} }; pclomp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>::Ptr ndt_omp (new pclomp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>()) ; ndt_omp->setResolution(1.0 ); }
如果编译链接不出错,即正常引用。按这种方式在项目中使用即可。
最后我打包了ndt_cpu/ndt_gpu/ndt_omp/omp_ndt(autoware中提供的),项目地址如下,可直接使用。
CMake常用指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 cmake_minimum_required (VERSION xxx) project (xxx) add_executable (target target_source_codes) SET (var_name var_value)MESSAGE ("MSG" ) option (var_name "comment" var_value) include_directories (xxx) add_subdirectory (xxx) add_compile_options (xxx) link_directories (xxx) add_library (lib_name SHARED or STATIC lib_source_code) target_link_libraries (target_name lib_name ...)
流程控制和循环指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 if (xxx)... elseif (xx)... else ()... endif ()foreach (va va_lists)... endforeach ()
install指令 1 2 3 4 5 6 7 install (FILES flie DESTINATION dir_path) install (PROGRAMS file DESTINATION dir_path) INSTALL (TARGETS ylib ylib_s LIBRARY DESTINATION lib ARCHIVE DESTINATION lib )
内置变量 1 2 3 4 5 6 CMAKE_INSTALL_PREFIX CMAKE_BUILD_TYPE CMAKE_C_FLAGS CMAKE_CXX_FLAGS CMAKE_CURRENT_SOURCE_DIR CMAKE_CURRENT_BINARY_DIR