linux下通过rpath解决cmake动态编译后找不到动态链接库问题

Linux动态库路径 本文将用实验的方法去探讨-L、-rpath和-rpath-link3个参数的区别。 阅读详情

这次书接上回,前段时间写了一篇《使用cmake构建C/C++项目和动态库》的文章,传送门。但是直接通过cmake编译链接后,会有一个问题,那就是需要的.so文件不能更改目录,一旦.so文件目录变了,整个程序就没法运行了,这肯定是不行的。

原因
后来我查一下一下,linux系统中,程序加载运行需要的.so文件是有顺序的

环境变量LD_LIBRARY_PATH指定的路径
gcc 编译时指定的运行时库路径-rpath
ldconfig 配置文件ld.so.conf指定的路径
系统默认库位置 /lib, /usr/lib
如果没有指定so的位置,gcc会自动把当前so所在的目录作为so的连接目录。知道原因了,问题就好解决了

解决办法
先看一下现在的 CMakeLists.txt文件

cmake_minimum_required(VERSION 3.13.3)
project(project1 C)

set(CMAKE_C_STANDARD 99)

add_library(shared SHARED library.h library.c)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

add_executable(project1 main.c)

target_link_libraries(project1 shared)

我实验了两种办法,一是把.so 文件放到/lib 或者 /usr/lib中,这也是在安装很多软件时的做法,当使用包管理器安装软件时,需要的.so文件大多是安装到这两个目录下。在一种就是在编译时指定 rpath的目录,使用相对目录,这样在复制文件的时候,把.so一起复制就可以了。

先用最简单的办法,把so目录放到系统目录下

现在的目录结构如下,程序依赖的libshared.so 在 lib 目录下,现在把 libshared.so 复制到 /lib 目录下。这里有个要注意的地方,复制完后要执行 ldconfig 命令,重新生成缓存,要不然程序依然找不到对应的.so文件
命令如下

sudo mv lib/libshared.so /lib
sudo ldconfig

这时候在运行 project1 不会报错

编译时指定 rpath目录
设置 rpaht 有两种方式

方式1

set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH $ORIGIN)

通过修改编译后的 install 路径, 让程序在运行时通过程序的相对目录加载.so文件,其中 $ORIGIN 变量是程序的当前目录

方式2

set_target_properties(project1 PROPERTIES LINK_FLAGS "-Wl,-rpath,./")

方式2更粗暴,直接设置gcc的编译参数,指定rpaht 是当前目录

修改 CMakeLists.txt文件

cmake_minimum_required(VERSION 3.13.3)
project(project1 C)

set(CMAKE_C_STANDARD 99)

add_library(shared SHARED library.h library.c)

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

#方式1

set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH $ORIGIN)
add_executable(project1 main.c)

#方式2

#set_target_properties(project1 PROPERTIES LINK_FLAGS "-Wl,-rpath,./")
target_link_libraries(project1 shared)

重新生成 MakeFile 文件, 然后编译

编译生成的 libshared.so 还是在 lib目录下,先移动到可执行文件的同级目录下

最终目录如图,现在无论怎么复制文件,只要可执行文件和动态库在一个目录下,都以运行了

总结
解决linux下 动态编译的程序找不到动态库的问题,有多种解决办法,这次用了两种

把需要的.so文件放到 /lib 或者 /usr/lib 下, 然后执行 ldconfig命令
通过指定 rpath 来决定加载 .so的目录

【信息科学与工程学】【产品体系】第二十六篇 存储系统及存储服务器中所有学科知识01 存储系统是一门交叉学科,涉及计算机体系结构、分布式系统、编码理论、操作系统、网络等多个领域。编号类型学科/课程/产品存储系统领域的作用(含 AI infra / 存储网络 / 存储服务器 / 存储领域)核心知识点及数学建模/方程式/算法在存储系统中的作用及详细设计方法、时序、流程、模式代表教材/资料/论文 + 链接工业界应用001基础理论计算机体系结构、操作系统决定存储层级(寄存器-L1/L2/L3-内存-SSD-HDD-磁带),是 AI 训练集群、存储服务器、SAN/NAS 的物理底座存储层级模型:访问延 阅读详情

相关推荐

Visual Studio 2015 插件开发 从入门到放弃(一)

必需知识:C#和Visual Studio (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools)。对于已经安装好 Visual Studio 2015 的小伙伴,可以找VS2015的安装包,或者在程序与功能中找VS2015双击,在VS2015界面中选择 修改,再选择

AncientPeople的博客 2万+

【Linux 应用开发 】Linux环境下动态链接库路径(RPATH)的调整策略

在Linux环境下开发和部署应用时,动态链接库的管理是一个不可忽视的环节。特别是当我们谈论到应用的可移植性和灵活性时,理解和掌握如何调整动态链接库路径(RPATH)变得尤为重要。本章将对RPATH的重要性进行简要介绍,并概述动态链接库搜索机制的基本原理。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3304

从零开始:使用Mask2Former训练你的专属图像分割数据集

本文详细介绍了如何使用Mask2Former训练自定义图像分割数据集,从环境配置、数据集准备到模型训练与优化。通过实战技巧和问题排查指南,帮助开发者高效完成从零开始的图像分割任务,特别适合需要处理自定义数据集的AI研究人员和工程师。

weixin_30566063的博客 645

linux c编译找不到文件或目录,linux下通过rpath解决cmake动态编译后找不到动态链接库问题...

以后没啥好图,封面就上小姐姐图了桥本有菜这次书接上回,前段时间写了一篇《使用cmake构建C/C++项目和动态库》的文章,传送门。但是直接通过cmake编译链接后,会有一个问题,那就是需要的.so文件不能更改目录,一旦.so文件目录变了,整个程序就没法运行了,这肯定是不行的。原因后来我查一下一下,linux系统中,程序加载运行需要的.so文件是有顺序的环境变量LD_LIBRARY_PATH指定的路...

weixin_35369702的博客 1580

HttpClient跳过HTTPS证书验证的3种实战方法(含完整代码示例)

本文详细介绍了HttpClient跳过HTTPS证书验证的3种实战方法,包括自定义TrustManager、SSLContext配置和HttpClientBuilder高级定制,并提供完整代码示例。这些方法适用于开发和测试环境,帮助开发者快速解决自签名证书或未认证证书导致的HTTPS请求失败问题,但需注意生产环境的安全风险。

weixin_29213655的博客 530

数据可视化—power bi 基础操作汇总

数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 .

weixin_52730784的博客 2683

linux可执行文件运行时加载库路径 rpath

linux 可执行文件动态库记载路径设置

JCYAO_的博客 951

K230在原有LVGL控件触摸屏控制的基础上,增加USB鼠标控制!

搭配CanMV图形化编程,中小学生可快速开发“键鼠控制AI小游戏”“智能画板”等趣味项目,降低AI学习门槛;:HDMI屏幕+键鼠组合,直接在开发板上调试代码、修改ISP参数、查看AI推理日志,无需频繁连接电脑;:打造带交互的AI设备(如工业控制面板、智能显示器),鼠标操作菜单、键盘输入指令,体验媲美小型PC;:无网络场景下,通过键盘直接向AI设备录入数据、配置参数,适配野外监测、本地工控等场景。,自动识别、快速响应,完美适配交互控制、参数调试、数据输入等场景。

weixin_47446386的博客 148

CMake中INSTALL_RPATH与BUILD_RPATH问题

CMake为了方便用户的安装,默认在make install之后会自动remove删除掉相关的RPATH,这个时候你再去查看exe的RPATH,已经发现没有这个字段了。如何让CMake能够在install的过程中写入相关RPATH,并且该RPATH不能使当初build的时候的RPATH呢?设置linker的rpath选项:$ gcc -Wl,-rpath,/your/rpath/ test.cpp。如果需要设置$ORIGIN:$ gcc -Wl,-rpath,‘$ORIGIN/lib’ test.cpp。.

喜欢打篮球的普通人 5472

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

SMFA(自调制特征聚合模块): SMFA模块用于协同建模局部和非局部信息,它分为两个分支:一个是EASA(Efficient Approximation of Self-Attention,简化的自注意力分支),用于捕获非局部信息;另一个是LDE(Local Detail Estimation,局部细节估计分支),用于捕获局部细节。EASA通过对输入特征进行下采样,然后利用全局特征的方差进行调制,再与原始特征进行聚合,提取非局部结构信息。LDE分支则通过卷积操作提取输入特征中的高频局部信息。

qq_64693987的博客 2208

【LAMP架构-1】

首先在 server1 上编辑 Nginx 主配置文件,在 upstream 块中定义后端服务器池,分别指定 server2、server3 和 server4(只有当所有的后端server全部失效才会被启用) 的 IP 地址。轮询(round-robin)是默认的调度算法,请求会依次分配给每一台后端服务器。为了让域名 www.example.com 能够解析到 server1 的 IP,需要在 server1 本地配置 hosts 解析记录。这样在测试时可以直接通过域名访问负载均衡入口。

insert_Yam的博客 311

k8s配置habor作为镜像地址之后,如果harbor中没有镜像,如何设置自动从阿里云官方镜像仓库下载

通过 Harbor 的远端仓库可以集中管理。如果你在上游设置了 image prefix 为 library,那么对外访问 harbor.your-domain.com/library/nginx:latest 就会被 Harbor 去上游拉取 registry.cn-hangzhou.aliyuncs.com/library/nginx:latest 并缓存。- 将集群中的镜像地址改为 Harbor 的域名,比如 harbor.your-domain.com/library/nginx:latest。

极客栈 426

CMake深入解析:打造高效动态链接库路径设置

在软件开发中,动态链接库(Dynamic Link Libraries, DLLs)和静态链接库(Static Link Libraries, SLLs)的使用和管理,往往反映出开发者对知识结构和逻辑的理解。静态链接库在编译时将代码直接嵌入到可执行文件中,而动态链接库则是在运行时被载入。这种差异,就像人类思维中的直觉与反思:直觉是内在的、立即的,相当于静态链接;而反思则需要外部输入,需要时间和空间,类似于动态链接。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2644

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

linux下无法打开“libc-start.c”: 找不到文件。解决方案

既然找不到,就在他找不到的地方整一个libc-start.c 在相应位置创建相应文件夹以及下载相应文件 #首先下载文件 sudo apt install glibc-source #跳转到下载目录 cd /usr/src/glibc/ #解压文件 sudo tar -xvf glibc-[2.31].tar.xz #然后创建目录 cd / sudo mkdir build cd build sudo mkdir glibc-XXXXXX #这个文件夹跟报错的地方那个文件夹名字对应 cd glibc-X

TTMer's blog: 1520

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MakeFile编译错误

如图,此错误是我在MakeFile编译时遇到的错误提示,找了好久才发现问题所在;自己又尝试了出现这种错误的其他原因,现做一总结分享。编译时找不到对应的函数(一个可能是主函数找不到,二个是.h头文件里声明的函数没有找到)查看.h文件里所声明的函数在.c文件里是否都能找到。确认自己.c文件里的内容是否都已保存。查看所编译的.c 文件名是否有错误。

2202_76081184的博客 696

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux c编译找不到文件或目录,c – 编译错误:在kubuntu linux中找不到-lGLU和-lGL

我在kubuntulinux 11.10中编译“hello world”应用程序有一些问题.这是项目文件:// opengltext.proSOURCES += \main.cppQT += opengl和一个cpp文件:// main.cpp#include int main( int argc, char *argv[] ){QApplication app( argc, argv );ret...

weixin_33127399的博客 418

make编译时找不到链接库

在编译时,报错如下: /usr/bin/ld: 找不到 -lcanlib /usr/bin/ld: 找不到 -lkvadblib collect2: error: ld returned 1 exit status CMakeFiles/demo.dir/build.make:113: recipe for target 'demo' failed make[2]: *** [demo] Erro...

不二青衣的博客 2429

RPATH

rpath 在linux中的作用等。

qq_43561784的博客 2336

Linux平台关于可执行程序的动态库加载路径(rpath)的查看与修改

修改rpath($ORIGIN是一个特殊的变量,指示实际的可执行文件名。它在运行时解析到可执行文件的位置,在设置RPATH时非常有用)

汪汪的博客 2711

C++源码编译程序时指定动态库的查找相对路径-rpath

参考:C++编译知识笔记(一)——基本知识-菜鸟笔记参考:https://www.cnblogs.com/born2run/p/16361813.html

victorwongms90的博客 576

linux的c语言编译链接过程(gcc,ld),出现没有这个文件或目录及段错误的解决

编译链接过程

qq_41043166的博客 8583

cmake 实用小技巧

第一步:在cmake开始时设置,让编译出来的动态库不要将编译时路径添加到RPATH中。第二步:在 add_library 之后,target_link_libraries 之前,设置下面的属性,让当前动态库查找依赖库时从 …/lib或者./lib查找。这样哪怕有多级依赖,最后我们打包可执行程序时,只需要将所有的动态库放到lib目录,可执行程序放到bin目录即可(可选)。–disable-new-dtags 的作用是不要使用run-path,统一使用rpath。 configure 方式设置rpath 有时候

q2nAmor 1926

Linux下可执行文件指定运行时库(.so文件)路径

rpath 全称是run-time search path,规定了Linux下可执行文件在寻找.so文件时的第一优先位置

崔杰城的博客 2432

C++学习—— CMake找不到LD_LIBRARY_PATH的so文件

C++学习——CMAKE找不到LD_LIBRARY_PATH的so文件

m0_37876745的博客 2971
上一篇: MySQL占用cpu原因排查
下一篇: c++windows打印乱码
theoderic001
博客等级 码龄7年 37粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值