栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

cmake 链接已编译好的 *.so 库采坑总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

cmake 链接已编译好的 *.so 库采坑总结

参考:

  1. CMake——第三方库引入
  2. 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

总结:

  1. CMakeLists.txt 写正确
  2. 编译好的第三方*.so库前面加lib
  3. 要有*.so 库用到的库相同的版本、环境
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976423.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号