参考:
- CMake——第三方库引入
- cmake导入so库_CMAKE使用链接第三方SO库
背景,在检测点云的代码中加入同事的追踪.so 库
目录结构:
├── include │ └── LidarTracking.h ├── lib │ └── LidarTracking.so ├── CMakeLists.txt ├── main.cpp
CMakeLists.txt 为:
set(PROJECT_NAME PcdLabelView)
project(${PROJECT_NAME})
cmake_minimum_required(VERSION 3.10)
add_compile_options(-std=c++11 -fPIC)
set(PCL_DIR ~/softwares/3rdparty/pcl181/share/pcl-1.8)
find_package(PCL 1.8 REQUIRED)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ~/softwares/3rdparty/opencv_env/opencv349/share/OpenCV)
find_package(OpenCV REQUIRED)
set(INC_DIR ${PROJECT_SOURCE_DIR}/include)
set(LINK_DIR ${PROJECT_SOURCE_DIR}/lib)
include_directories(${OpenCV_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
${INC_DIR}
)
link_directories(${OpenCV_LIB_DIR}
${PCL_LIBRARY_DIRS}
#/usr/lib/x86_64-linux-gnu
${LINK_DIR}
)
add_definitions(${PCL_DEFINITIONS})
message(libaries:${LINK_DIR})
add_executable (LidarView main.cpp)
target_link_libraries (LidarView
${PCL_LIBRARIES}
${OpenCV_LIBS}
${LINK_DIR}/LidarTracking.so
pthread m boost_system boost_thread dl)
编译出现错误:找不到 LidarTracking
[ 50%] Building CXX object CMakeFiles/LidarView.dir/LidarView.cpp.o [100%] Linking CXX executable LidarView /usr/bin/ld: cannot find -lLidarTracking collect2: error: ld returned 1 exit status CMakeFiles/LidarView.dir/build.make:365: recipe for target 'LidarView' failed make[2]: *** [LidarView] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/LidarView.dir/all' failed make[1]: *** [CMakeFiles/LidarView.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2
改名 LidarTracking.so --> libLidarTracking.so,同时修改CMakeLists.txt :
target_link_libraries (LidarView
${PCL_LIBRARIES}
${OpenCV_LIBS}
${LINK_DIR}/libLidarTracking.so
pthread m boost_system boost_thread dl)
编译报错:
这次能找到 libLidarTracking.so , undefined reference c++ 中常见的一个错误,函数声明而没有实现,怀疑是vtk 版本的问题,pc 端是 vtk 6.3 ,libLidarTracking.so 用的vtk 是7.1
[ 50%] Building CXX object CMakeFiles/LidarView.dir/LidarView.cpp.o [100%] Linking CXX executable LidarView ~/workspace/newTrackingLib/lib/libLidarTracking.so: undefined reference to `vtkObjectFactoryRegistryCleanup::vtkObjectFactoryRegistryCleanup()' ~/workspace/newTrackingLib/lib/libLidarTracking.so: undefined reference to `vtkObjectFactoryRegistryCleanup::~vtkObjectFactoryRegistryCleanup()' collect2: error: ld returned 1 exit status CMakeFiles/LidarView.dir/build.make:365: recipe for target 'LidarView' failed make[2]: *** [LidarView] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/LidarView.dir/all' failed make[1]: *** [CMakeFiles/LidarView.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2
查看 libLidarTracking.so 用到的 vtkObjectFactoryRegistryCleanup 类
$ nm -A ../lib/libLidarTracking.so | grep -i vtkObjectFactoryRegistryCleanup ../lib/libLidarTracking.so:000000000021a4e0 b _ZL39vtkObjectFactoryRegistryCleanupInstance ../lib/libLidarTracking.so: U _ZN31vtkObjectFactoryRegistryCleanupC1Ev ../lib/libLidarTracking.so: U _ZN31vtkObjectFactoryRegistryCleanupD1Ev
重新安装了 vtk-7.1 ,pcl-1.8库 ,编译成功。
$ make -j4 Scanning dependencies of target LidarView [ 50%] Building CXX object CMakeFiles/LidarView.dir/LidarView.cpp.o [100%] Linking CXX executable LidarView [100%] Built target LidarView
总结:
- CMakeLists.txt 写正确
- 编译好的第三方*.so库前面加lib
- 要有*.so 库用到的库相同的版本、环境



