gcc编译过程中-L和-rpath的作用

news2025/1/14 8:55:18

前言

今天记录一下,在gcc编译过程中-L和-rpath的区别

-L是程序链接过程中指定链接动态库的路径,-rpath是程序运行过程中指定链接动态库的路径。(官方话术)

其实就是当gcc编译生成可执行文件的时候需要指定-L参数,才能找到动态库,才可以成功的打包可执行文件,而程序运行过程中-L这个参数所指定的内容其实已经没用了,如果不指定-rpath或者采用其它手段给可执行文件设置搜索路径的情况下,可执行文件会默认从/usr/lib或者/lib这些目录下去寻找对应的动态库,如果找不到的话,那自然就是报错啦。

动态库介绍

  • 动态库,是一种在程序运行过程中,程序主动去加载的第三方库文件。不同于静态库,静态库在程序编译过程中就已经被打包进可执行文件中了。而动态库需要独立于可执行文件存放到机器中。
  • 动态库在不同操作系统下文件扩展名不同,通常在linux下扩展名为so,在windows下扩展名为dll

实操试演

制作动态库

首先我们得需要一个动态库,这个库可以是第三方程序编译打包的,也可以是我们自己制作的动态库,这里为了简便,就自定义了一个简单动态库。

编写程序,程序的目录结构如下

calc.cpp内容如下

#include "calc.h"
#include <stdio.h>

int add(int num1, int num2) {
    printf("calc %d + %d\n", num1, num2);
    return num1 + num2;
}

calc.h内容如下

#ifndef CALC_SO_CALC_H
#define CALC_SO_CALC_H

int add(int num1, int num2);

#endif

main.cpp内容如下

#include "stdio.h"
#include "calc.h"

int main() {
    printf("1 + 1 = %d\n", add(1, 1));
    return 0;
}

程序准备完成之后开始打包动态库

# 进入到项目的根目录下,即main.cpp文件所在目录
# 生成目标文件calc.o
gcc src/calc.cpp -o calc.o -c -fPIC -I./include
# 通过编译后的文件生成动态库文件
gcc -shared -fPIC -o libcalc.so calc.o

链接动态库生成可执行文件

在上述根目录中执行命令,生成可执行文件

# 寻找当前路径下的libcalc.so库,链接到程序中
gcc main.cpp -I./include -L./ -lcalc -o test

这边-L后面的参数所指向的路径下,需要真的有libcalc.so这个动态库文件,否则编译会报错

当使用上述命令成功生成可执行文件之后-L这个参数所指定的路径其实就已经没有作用了,这个时候如果没有额外指定运行时动态库搜索路径的话,程序会运行失败。

有三种方式可以给可执行文件指定动态库搜索

方式一:指定rpath路径

在编译的过程中指定rpath路径命令如下:

# 设置运行时搜索路径为可执行文件所在目录,这样只要动态库文件和生成的可执行文件在一个目录即可加载成功
gcc main.cpp -Wl,-rpath='./' -I./include -L./ -lcalc -o test

方式二:指定环境变量LD_LIBRARY_PATH

通过设置环境变量LD_LIBRARY_PATH

# 设置环境变量为当前so所在路径
export LD_LIBRARY_PATH=/opt/project/base_repo_study/test

通过这种方式链接的动态库,只在本次绘画中有效,因为如果重新连接服务器,上一次设置的环境变量就销毁了,如果需要长期有效,需要在~/./bashrc文件中设定环境变量。

方式三: 将动态库放置到默认搜索路径下

这个方案就很简单了,直接在/usr/lib目录下把动态库放进去就好了

上述的三种方案中,各有优劣。

  • 第一种方案,需要给编译的可执行文件指定搜索路径,每个可执行文件的搜索路径都可以是不相干的,如果某些库是独属于当前这个项目所有的,很少会有其它项目会使用到这个库,那么使用第一种会更好一点。
  • 第二种方案,设置了环境变量之后,整台机器上所有可执行文件的搜索路径都会受到影响,可能会造成一些意料之外的问题,可以专门设定一个目录,用作收集一些比较公用的库,然后将这个路径设置成为环境变量,这样以后写项目的时候就不需要一直指定rpath了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D目标检测数据集——kitti数据集

KITTI官网网址&#xff1a;The KITTI Vision Benchmark Suite 下载数据集&#xff1a;The KITTI Vision Benchmark Suite KITTI数据集论文&#xff1a;CMSY9 github可视化代码&#xff1a;GitHub - kuixu/kitti_object_vis: KITTI Object Visualization (Birdview, Volumetric …

AI大模型赋能!移远通信打造具有“超能力”的AI智能玩具解决方案

随着无线通信、先进算法以及AI大模型等前沿技术的蓬勃发展&#xff0c;许多玩具已经从简单的互动设备进化为集教育、陪伴和娱乐功能于一身的AI智能玩具&#xff0c;在儿童群体中日渐风靡。不仅如此&#xff0c;因其能提供满满的情绪价值&#xff0c;在成年人和老年人市场中也展…

LED灯按键调光芯片、PWM调光IC、发光灯控制调光芯片

按键调光芯片&#xff0c;特别是LED灯使用PWM调光的芯片IC&#xff0c;是一种用于控制LED灯具亮度的集成电路&#xff0c;常用于台灯、壁灯、吊灯等照明设备中。这种芯片通过脉冲宽度调制&#xff08;PWM&#xff09;技术来调节LED的亮度&#xff0c;可以实现从最亮到最暗的平滑…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下&#xff0c;节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…

what?ngify 比 axios 更好用,更强大?

文章目录 前言一、什么是ngify&#xff1f;二、npm安装三、发起请求3.1 获取 JSON 数据3.2 获取其他类型的数据3.3 改变服务器状态3.4 设置 URL 参数3.5 设置请求标头3.6 与服务器响应事件交互3.7 接收原始进度事件3.8 处理请求失败3.9 Http Observables 四、更换 HTTP 请求实现…

前端练习题

图片&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>用户信息页面</title><style>body {font-family: Arial, sans-serif;margin: 20px;}.user-info {display: flex;align-it…

jupyter notebook练手项目:线性回归——学习时间与成绩的关系

线性回归——学习时间与学习成绩的关系 第1步&#xff1a;导入工具库 pandas——数据分析库&#xff0c;提供了数据结构&#xff08;如DataFrame和Series&#xff09;和数据操作方法&#xff0c;方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库&#xff0c;p…

车载音频开发(二):对音频数据作音量调节

通过前一个章节打下的基础车载音频开发&#xff08;一&#xff09;&#xff1a;从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(五)

文章目录 一、学生管理模块功能实现1、添加学生功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、学生管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码…

【Rust】数据类型

目录 思维导图 1. 数据类型概述 1.1 标量类型 1.1.1 整数类型 1.1.2 浮点数类型 1.1.3 布尔类型 1.1.4 字符类型 1.2 复合类型 1.2.1 元组类型 1.2.2 数组类型 2. 类型注解与类型推断 3. 整数溢出处理 4. 数字运算 5. 示例 思维导图 1. 数据类型概述 Rust是一种静…

Matlab一些使用技巧

代码分段 两个百分号就可以实现代码的分段&#xff0c;不同段之间会以不同的背景色显示&#xff0c;方便调试 如下&#xff1a; %% 腐蚀 stlen TimeWidth*Fs/50; %线性算子的长度&#xff0c;1/100的脉宽&#xff0c;对应0.5us&#xff0c;15个采样点 stlen 100; SE strel…

【Linux系统】权限位(mode bits)

这张图是使用结构体 struct stat 中的 st_mode 字段时画的&#xff0c;获取表示文件的类型和权限&#xff0c;它是典型的 POSIX 系统调用&#xff08;如 stat() 和 fstat()&#xff09;返回的 struct stat 结构的一部分&#xff0c;用于描述文件的元数据。 在 Linux 和 Unix 系…

快速上手 INFINI Console 的 TopN 指标功能

背景 在分布式搜索引擎系统&#xff08;如 Easysearch、Elasticsearch 和 OpenSearch&#xff09;中&#xff0c;性能监控至关重要。为了确保系统的高效运行和资源的合理分配&#xff0c;我们通常需要关注一段时间内关键资源的使用情况&#xff0c;特别是索引、节点和分片的内…

LIEF:用于解析和修改 ELF, PE 和MachO 格式的跨平台库

主要功能 1. 解析&#xff1a;LIEF能够解析ELF、PE和MachO格式&#xff0c;并给用户提供了友好的API来访问文件格式内部数据。 2. 修改&#xff1a;LIEF能够修改上述格式的部分数据。 3. 抽象&#xff1a;这些格式拥有一些常见特征&#xff0c;例如数据段、符号和入口…

验证码的设置

一、准备环境 首先&#xff0c;进入下载地址&#xff1a;Central Repository: cn/hutool/hutool-all/5.8.16下载jar包 二、配置环境 将下载好的jar包放到eclipse的lib目录 (这里是eclipse软件中存放jar包的目录)&#xff1a; 【WebContent-->WEB-INF-->lib】 三、基础…

FreeCAD集成gmsh源码分析

目录 gmsh模块界面获取gmsh的版本执行gmsh网格划分gmsh模块界面 这个界面是用PySide来写的,Pyside是QT的python绑定,具体代码在task_mesh_gmsh.py文件中。目前这个界面非常的捡漏,没有对接gmsh稍微高级一点的功能。界面对应的事件处理是在gmshtools.py中。这里只分析“gmsh …

忘记了PDF文件的密码,怎么办?

PDF文件可以加密&#xff0c;大家都不陌生&#xff0c;并且大家应该也都知道PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和offi…

怎么开通电信跨国网络专线服务?

随着全球化的发展&#xff0c;企业对高效稳定的跨国网络连接需求不断增长。电信跨国网络专线服务凭借其灵活性、安全性和高效性&#xff0c;成为许多企业跨国通信的优选方案。本文将为您详细介绍如何开通这一服务&#xff0c;并分享关键的注意事项&#xff0c;帮助企业更好地利…

MarkDown常用方法

标题 #空格 一级标题 ##空格 二级标题 依次类推 有序列表 操作&#xff1a;数字英文小数点(.)空格示例&#xff1a;1. list12. list2无序列表 操作&#xff1a;- 空格 或 * 空格示例&#xff1a; - list1- list2嵌套有序列表 操作&#xff1a;tab 数字 空格 示例&#xff1a; …

使用gtsam添加OrientedPlane3Factor平面约束因子

在基于地面约束的SLAM优化中&#xff0c;已知的地面信息&#xff08;如 plan.pcd 文件中的地面模型&#xff09;可以用作一个先验约束&#xff0c;以帮助优化位姿估计。具体而言&#xff0c;这个过程涉及将地面模型和每个帧的位姿结合&#xff0c;以创建一个因子模型&#xff0…