我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux动态链接库的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux动态链接库的使用

动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculate.h和caculate.c两个文件,生产libcac.so动态链接库。

针对二进制文件有用的命令

查看文件类型


file

查看二进制文件链接到哪些库


ldd

查看二进制文件里面所包含的symbol,T表示加载,U表示undefined symbol


nm

读二进制文件里面的信息


readelf -a smu.o

将二进制文件转换为汇编


objdump -d sum.o

动态链接库的生成

sum.c


#include <stdio.h>
#include <stdlib.h>

int sum(int x){
 int i, result=0;
 for(i=0; i<=x; i++){
  result+=i;
  }
 if(x > 100)
  exit(-1);
 return result;
};

void display(char* msg){
 printf("%s\n",msg);
}
 
int add(float a,float b){
 return a+b;
}

int sum_array(int array[], int num){
 int i =0, sum = 0; 
 for(i=0; i<num; ++i) 
  sum += array[i];
 return sum;
}

void modify_array(int array[], int num){
 int i =0, sum = 0; 
 for(i=0; i<num; ++i) 
  array[i] *= 10;
}

main.c


#include <stdio.h>
#include <stdlib.h>

int main(void){
 int x;
 printf("Input an integer:\n");
 scanf("%d", &x);
 printf("sum=%d\n", sum(x));
 return 0;
};

生成可执行文件


gcc -c main.c -o main.o
gcc -c sum.c -o sum.o
gcc sum.o main.o

将会生成main的可执行文件


file main  // ELF 64-bit LSB executable
file sum.o // ELF 64-bit LSB relocatable

因为sum.c里面含有可复用的函数,所以想把sum.c编译成为一个动态链接库


gcc sum.o -shared -o sum.so

出现错误,提示

/usr/bin/ld: sum.o: relocation R_X86_64_PC32 against undefined symbol `exit@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

这说明不是所有的.o文件都能编译成为动态链接库,需要在.o文件生成时加参数-fPIC


gcc -c sum.c -fPIC -o sum.o
gcc sum.o -o shared sum.so

一般,共享库的编译命令为(曾经的实验)

动态链接库


gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. -lmyhello

静态链接厍


ar rcs libxx.a xx.o 
g++ -o main main.cpp -static -L. -lxx

这时候再


g++ -o main main.c sum.so
./main 

有时会报错

error while loading shared libraries: sum.so: cannot open shared object file: No such file or directory


ldd main
output:
sum.so => not found

这时候需要


export $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

注意:-fPIC是生成.o时使用,-shared是用来生成动态链接库的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux动态链接库的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux动态链接库的使用

动态链接库与普通的程序相比而言,没有main函数,是一系列函数的实现。通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。例如下面实现一个简单的整数四则运输的动态链接库,定义的caculat
2022-06-04

linux动态链接库的使用方法

这篇文章主要介绍“linux动态链接库的使用方法”,在日常操作中,相信很多人在linux动态链接库的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux动态链接库的使用方法”的疑惑有所帮助!接下来
2023-06-09

linux动态链接库使用方法分享

1、前言 在实际开发过程中,各个模块之间会涉及到一些通用的功能,比如读写文件,查找、排序。为了减少代码的冗余,提高代码的质量,可以将这些通用的部分提取出来,做出公共的模块库。通过动态链接库可以实现多个模块之间共享公共的函数。之前看《程序员的
2022-06-04

linux下静态链接库和动态链接库的区别有哪些

这篇文章主要讲解了“linux下静态链接库和动态链接库的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下静态链接库和动态链接库的区别有哪些”吧!
2023-02-07

Linux 下静态链接和动态链接的原理及应用

我们知道一个.c 文件经过编译、链接最终可以形成一个可执行文件。

Linux反编译中的动态链接库处理

在Linux中进行反编译时,如果遇到需要处理动态链接库(Dynamic Link Libraries,简称DLL)的情况,通常需要使用工具来处理动态链接库中的符号和函数。下面是一些常用的工具和方法:使用objdump命令查看动态链接库的符号
Linux反编译中的动态链接库处理
2024-08-22

python调用dll动态链接库

还是调用动态库,各种调用,但是呢,Python调用dll貌似不麻烦,至少我第一次就调用成功嘞。至于Python,我连语法都不知道,不过问题不大,边百度边写。环境:好像都可以,Python我在官网下载的python-3.6.4-amd64。然
2023-01-31

怎么使用C/C++生成的动态链接库

这篇文章主要讲解了“怎么使用C/C++生成的动态链接库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C/C++生成的动态链接库”吧!操作环境:Visual Studio 2017.N
2023-06-26

如何在 Linux 上动态链接模块库

学习如何用动态链接库将多个 C 目标文件结合到一个单个的可执行文件之中。
C语言Linux2024-12-01

厉害了,Python也能使用动态链接库

Ctypes总的来说还是蛮不错的,挺适合C语言小白学习,毕竟Api的确太多太复杂了,还是Python友好点。

linux中动态链接和静态链接的区别有哪些

这篇文章主要介绍“linux中动态链接和静态链接的区别有哪些”,在日常操作中,相信很多人在linux中动态链接和静态链接的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中动态链接和静态链接
2023-06-29

什么是动态链接库?

动态链接库(DLL)是Windows共享库,包含动态加载到运行程序中的代码和资源。与静态链接不同,动态链接允许程序在运行时使用外部库,节省内存并提高性能。DLL具有代码共享、模块化、平台独立性、性能提升和故障隔离等优点。加载过程包括操作系统搜索、映射和调用。DLL导出函数和数据,程序通过导入表访问。版本控制和注册表对于DLL管理至关重要。常见问题包括DLL地狱和劫持。使用DLL时需要注意版本兼容性、依赖项、注册和安全性。
什么是动态链接库?
2024-04-02

python调用动态链接库传送proto

什么是protobuf   protobuf是Google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。开发者定义类似于结构体的message,通过prot
2023-01-31

关于ffmpeg的动态链接库问题

FFmpeg是一个开源的跨平台音视频处理工具,可以用于录制、转码、编辑等各种音视频处理操作。它提供了一组动态链接库,可以用于在自己的应用程序中集成和调用FFmpeg的功能。使用FFmpeg的动态链接库时,需要先将FFmpeg的头文件和库文件
2023-09-08

C# 调用动态链接库(DLL)技术详解

C#可以通过平台调用服务(P/Invoke)或者Common Language Runtime(CLR)的集成方法来调用DLL中的函数。
C#DLL开发2024-11-30

编程热搜

目录