首页 > 系统相关 >Linux 运行时调用动态链接库的方法

Linux 运行时调用动态链接库的方法

时间:2024-07-05 16:27:12浏览次数:14  
标签:文件 gcc 调用 lib LIBRARY so Linux 动态链接库 PATH

项目场景:

Linux 动态链接库

调用 自定义 的动态链接库


   动态链接库:
         (1)编写.c和.h文件
         (2)将.c文件转成.o文件
                      gcc  -c  *.c  -fPIC 
         (3)将.o文件转成动态库文件  lib库名.so
                    gcc  -shared  -o lib库名.so  *.o
          (4) 使用动态库文件
                    gcc ex3.c -o res -I ./lib/  -L ./lib/ -l库名

	静态链接库:
        (1)编写.c和.h文件
        (2)将.c文件转成.o文件
                   gcc -c  xxx.c   
        (3)将.o文件转成静态库文件  lib库名.a
                  ar rcs  lib库名.a  *.o   
         (4) 使用静态库文件
                   gcc ex3.c -o res -I ./lib/  -L ./lib/ -lexmath -static

问题描述

gcc res文件时 找不到.so文件 使用 -L无法产生和静态库一样的效果;

-I(大写) /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib

-l (小写)world表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件),程序链接的库名是world。

原文链接:https://blog.csdn.net/sinat_31608641/article/details/122513674

//命令
$ gcc text.c -o res -I ./ -L ./ -lstrport
$ ./res 
//结果
error while loading shared libraries: libstrport.so:\
 cannot open shared object file: No such file or directory



原因分析:

系统找.so文件时默认路径是:/usr/lib/ 而我看似指向的是当前文件夹其实并没有产生效果


解决方案:

方法一:输入
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
echo $CD_LIBRARY_PATH
方法二:输入
sudo cp -i libstrport.so /usr/lib/

为什么修改LD_LIBRARY_PATH呢
因为运行时动态库的搜索路径的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib和/usr/lib;
————————————————

LD_LIBRARY_PATH: 动态库的查找路径

设置:

方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效

方法二: 修改/.bashrc或/.bash_profile或系统级别的/etc/profile

原文链接:https://blog.csdn.net/yueyecheshou1980/article/details/106096013

标签:文件,gcc,调用,lib,LIBRARY,so,Linux,动态链接库,PATH
From: https://blog.csdn.net/weixin_50746107/article/details/140161288

相关文章

  • 30个Linux运维面试题,面试一线大厂必备!
    在本文中,我们将讨论30个Linux系统管理员面试问题以及经验丰富的专业人士的答案。(1)为什么需要LVM?LVM(Logicalvolumemanagement)推荐使用LVM管理linux服务器上的磁盘或存储,可以在线调整LVM分区的大小,而不用停止服务器。(2)如何检查内存和CPU统计信息?使......
  • Linux 交叉编译(toolchain) ARM aarch64版 libcurl.so 库
    前言全局说明curl是用来访问网络,可以上传下载数据一、说明系统环境:ubunt18.04二、官网下载源码:2.1最新版本https://curl.haxx.se/download.htmlhttps://github.com/curl/curl/releases2.2历史版本https://curl.se/download/2.3变更日志https://curl.se/chan......
  • 韦东山IMX6ULL Linux开发板基于Buildroot系统QT应用环境配置开发运行
    @目录一.编译系统1.设置交叉编译工具链2.编译系统二.QT下载1.安装Qtcreator2.创建第一个程序3.配置QtCreator开发环境4.移植QT程序到开发板一.编译系统1.设置交叉编译工具链exportARCH=armexportCROSS_COMPILE=arm-buildroot-linux-gnueabihf-exportPATH=$PATH:/hom......
  • 大模型Linux本地化[离线]部署(以DB-GPT为例)
    DB-GPT本地化[离线]部署由于Python相关依赖包的获取极度依赖pip,而Miniconda支持环境隔离和环境打包,所以离线部署本质就是比在线部署多一步环境打包,环境搬迁。所以本篇文章一样适用于在线部署,以CentOS7为例。资源获取DB-GPT官方说明文档DB-GPT源码下载地址Nvidia驱动......
  • linux部署cassandra
    Cassandra数据库是一个高度可扩展、分布式的NoSQL数据库系统,最初由Facebook开发,用于处理大规模数据集并提供高可用性和高性能。随着其开源和广泛应用,Cassandra已经成为Apache软件基金会的一个顶级项目。以下是关于Cassandra数据库的详细介绍:一、基本概述类型:Cassandra是一个开......
  • linux(CentOS)搭建MySQL数据库--详细版
    1、MySQL数据库去mysql官网下载需要安装的mysql版本,我这里用的是mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz将该压缩包放到/usr/local/mysql_store目录下,mysql_store目录需要自己手动创建,cd/usr/localmkdirmysql_store然后解压该压缩包,输入如下指令:tar-zxvfmy......
  • Linux 账号安全管理及应用
    一、账号安全控制1.系统账号清理1.1 将非登录用户设置为无法登录usermod-s /etc/nologin pkm     #将名为pkm用户的shell设为/sbin/nologin用户pkm将无法登录1.2锁定长期不使用的账号usermod -L   用户名       #锁定......
  • Linux 文件系统以及日志管理
    一、inode与block1.inode与block详解在文件存储硬盘上,硬盘的最小存储单位叫做“扇区”,每个为512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小......
  • linux 服务器与本地文件传输
    相信有的小伙伴在刚开始接触linux时,不知道如何把文件上传到linux中,本文介绍两种方式供大家使用(推荐使用第二种)一.scp传输scpC:\\[email protected]/root/.....使用上述指令,即可实现将制定文件传输到服务器中,其中C…以及/root/…需要换成你自己的路径。165…........
  • Linux(Centos7)安装Docker 社区(ce)版
    安装准备查看Linux系统版本是否为centos7cat/etc/os-release确保系统内核为3版本以上uname-a安装Docker如之前安装过请卸载yumremovedocker\docker-client\docker-client-latest\docker-common\......