您现在的位置是:首页 > 正文

cmake 链接已编译好的 *.so 库踩坑总结(一)

2024-02-01 00:05:22阅读 2

参考:

  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 库用到的库相同的版本、环境

网站文章

  • [CF套题] CF-1163

    CF-1163 传送门 # Penalty A B1 B2 C1 C2 D E F 3 (483) 464 +0 0:06 +1 01:13 +3 01:12 + 01:57 + 01:56 A 第一个人离开时候不增加,第二个人离开时候隔一个走开 当m=0时,答案为0 n为偶数时,如果2m<=n那么答案为m,否则为n-m n为奇数时,如果2m<=n那...

    2024-02-01 00:05:16
  • 提升效率!Django 中鲜为人知的内置命令

    提升效率!Django 中鲜为人知的内置命令

    【导语】:在我们使用Django框架开发应用或者网站的过程中,通常会用到许多命令进行管理,例如常用的runserver, makemigrations, migrate, shell等。此外,许多第三方包也提供了一些命令,我们可以在项目中使用这些命令,来简化开发流程。今天我们一起来学习一些有用的新命令。如果你还不熟悉Django,这里有一篇简单易上手的教程。1. diff...

    2024-02-01 00:04:48
  • 过河(动态规划)

    有一条河,河中有n块石头,现在从河的一边只能通过走石头到达对岸,每一步可以跨越至多3个石头。但是不幸的是,有一块石头被上一个过河的人踩松后被踩松了,所以为了安全后来的人就不能再踩这一块石头了。若现在有一个人想要到河的对岸去,他有多少种方法?注:若我们将石头从1到n进行编号的话,那么被踩松的石头编号为k。输入格式:多组输入对于每组输入在一行中给出2个整数n和...

    2024-02-01 00:04:43
  • 小波变换原理

    小波变换原理

    https://www.cnblogs.com/warmbeast/p/7809286.html 从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们...

    2024-02-01 00:04:35
  • C++:容器的基本功能与分类

    C++:容器的基本功能与分类

    容器的基本功能与分类容器类是容纳、包含一组元素或元素集合的对象。基于容器中元素的组织方式:顺序容器、关联容器按照与容器所关联的迭代器类型划分:可逆容器和随机访问容器容器的基本功能与分类容器unorde...

    2024-02-01 00:04:27
  • 前端安全知识

    前端安全知识

    原文连接 https://jkchao.cn/article/59d... XSS xss: 跨站脚本攻击(Cross Site Scripting)是最常见和基本的攻击 WEB 网站方法,攻击者通过注入非法的 html 标签或者 javascript 代码,从而当用户浏览该网页时,控制用户浏览器。 xss 主要分为三类: DOM x...

    2024-02-01 00:03:57
  • 虚拟服务器 双机,HA双机软件如何使用虚拟(VIP:Virtual IP)

    HA高可用,一般是对外提供一个固定IP地址或者固定域名供用户访问。固定域名方式需要域名解析为对应的ip地址,是一种分布式系统,这个和虚拟ip没关系。固定ip地址访问的方式,这个访问的ip又怎么知道服务...

    2024-02-01 00:03:50
  • visual studio客户端windows模式下调出cmd命令行

    visual studio客户端windows模式下调出cmd命令行

    visual studio 设置技巧

    2024-02-01 00:03:12
  • 关于rpm 命令的--changelog参数

    关于rpm 命令的--changelog参数

    2024-02-01 00:03:06
  • java面试题 --- 异常类型及处理

    java面试题 --- 异常类型及处理

    1.Java异常类型 2.异常的处理 异常处理指的是对可提前检查的异常的处理。 1>使用try...catch语句块来处理 2>使用throws/throw抛出到上层 3.finally关键字 finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。 在 finally 代码块中,可以运行清理类型...

    2024-02-01 00:02:48