首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

链接两个名字完全一样的【动态库】,你会怎么处理?

作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。...关注下方公众号,回复【书籍】,获取 Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章( PDF 格式)。...【目录】 第一个动态库文件 应用程序 第二个动态库文件 错误做法:直接给它改名 正解:patchelf 工具 One More Thing 在Linux应用的开发过程中,直接利用现成的第三方库(俗称:轮子...可以参考很久之前写的一篇文章:Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索。...Raises an error if DT_SONAME doesn't exist [--set-soname SONAME] Sets 'DT_SONAME' entry to SONAME.

2.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

linux 什么是SO文件

下面的内容大多都是连接中的,穿插我自己的笔记 牵扯到ELF格式,gcc编译选项待补,简单实用的说明一下,对Linux下的so文件有个实际性的认识。 1.so文件是什么?...-soname:   soname的关键功能是它提供了兼容性的标准:   当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。...这个特性使得在Linux下,升级使得共享库的程序和定位错误变得十分容易。   ...在Linux中,应用程序通过使用soname,来指定所希望库的版本,库作者可以通过保留或改变soname来声明,哪些版本是兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。...下面的还没细看,汗 4.库的初始化,解析: windows下的动态库加载,卸载都会有初始化函数以及卸载函数来完成库的初始化以及资源回收,linux当然也可以实现。

5.5K20

Linux的静态库和共享库详解及实例

Linux下分为静态库和共享库(也叫动态库),当然Windows下也有静态库(.lib)和动态库(.dll),这里主要是讲解Linux下的静态库和共享库,以及它们的简单实现。        ...在Linux中静态库以.a为后缀,首先静态库的实现是在文件编译后的链接过程中就被载入到了程序中,那么后续的程序的运行使用就不会再依赖库,那么弊端就是将静态库载入到程序中会导致程序的体积变大,而且如果静态库后续进行了更新...共享库包括realname soname linkname三个名字,realname的结构如下 ?        ...通常我们都会将soname和linkname分别与realname建立软连接,那么链接soname和linkname实际上就是链接到了realname。...然后通过ldconfig -v来更新系统中的动态链接库,然后我们就可以发现soname就有动态库的目录了,而且在lib中也生成了soname的软链接文件。 ?

3.3K20

Linux gcc编译生成静态库和共享动态库的过程

这篇文章主要通过实例演示在Linux下如何使用gcc分别编译生成静态库和动态库文件以及其它程序如何使用这个生成的静态库和动态库。...这时使用ldconfig -v命令查看系统动态库的搜索路径,可以看到libmyhello.so.1动态库所在的路径为绝对路径/root/: 3.2 先生成real name动态库文件,然后创建soname...是libmyhello.so.1 [root@typecodes ~]# gcc -g -shared -Wl,-soname,libmyhello.so.1 -o libmyhello.so.1.0.1....1: 如下图所示,使用ldconfig -vn .命令在当前目录自动生成一个软链接:将soname(libmyhello.so.1)链接到real name(libmyhello.so.1.0.1)。...如下图所示,使用ln -sf libmyhello.so.1 libmyhello.so命令创建链接到soname的共享库文件名(Link Name):libmyhello.so。 ​

12510

Linux下创建自己的共享库

由于windows和linux的本质不同,因此二者库的二进制是不兼容的。 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。...Linux系统有几个重要的目录存放相应的函数库,如/lib, /usr/lib。 静态函数库、动态函数库 A....对一个库做ar s等同于对该库做ranlib 动态函数库的创建 gcc -shared -Wl,-soname,youLibSoname,-o youRealName a.o b.o **linux共享库名称分为三段...:realname,soname,linkname realname:共享库的全名,比如:libmycal.so.1.10 soname:只是包含共享库的版本号,比如:libmycal.so.1...(1)编译产生.o文件 gcc -c -fPIC add.c gcc -c -fPIC sub.c (2)创建共享库 gcc -shared -Wl,-soname,libmycal.so.1,-o libmycal.so

2.4K10

Linux库详解

一般来说一个共享库有三个名字:soname、real-name、linker-name soname是一个软连接,用来区分版本的名字,如果real-name文件存在的话,它是指向real-name的软链接文件...在工作系统上,完全限定的 soname 只是指向共享库“真实姓名”的符号链接 real-name每个共享库还有一个“真实名称”,即包含实际库代码的文件名。...真实姓名在soname上加上一个小数点、一个小号、另一个小数点和发布号。最后期间和版本号是可选的。次要编号和版本号通过让你确切知道安装了哪些版本的库来支持配置控制。...请注意,这些数字可能与文档中用于描述库的数字不同 linker-name是传递给连接器的名字,应用程序调用时用于链接的搜索,一般它可能就是指向soname的连接,名称的形式一般是lib*.so。...换句话说,它只是没有任何版本号的soname Linux系统上这样做的目的主要是系统中允许不同版本的库文件共存,一般在命名库文件的时候通常与soname相同 如何装载共享库 ldconfig命令,在Linux

2K40

从程序员角度看ELF

item/1568184cf23d6dfad72afca3.html   一个链接的example   ld -o test -e_start -dynamic-linker=/lib/ld-linux.so....2 crt1.o crti.o crtbegin.o test.o -L /usr/lib/gcc/i386-redhat-linux/4.0.0/ -ldl -lc crtend.o crtn.o...通过dynamic段,链接器在它自己的数据段中找到自己的重定位项表和   重定位指针,然后解析例程需要加载的其它东西的代码引用(Linux ld.so将所有的基础例   程都命名为由字串_dt...例如,被称为libc.so.1.1的库的SONAME为libc.so.1(缺省的SONAME是库的名   称)。...缓冲文件创建程序扫描包含共享库的所有目录,查找所有的共享库,提取每一   个的SONAME,对于具有相同SONAME的多个库,除版本最高的外其余的忽略。

93640

静态库(.a)与动态库(.so)的简明介绍

静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只要有了一个线索都很容易理解...静态库又叫归档文件,在linux下是*.a后缀的文件,本质上就是目标文件(*.o)的一个集合。.../resultant print_mod1 print_mod2 动态库别名(-Wl,-soname,xx) 这里再说说-Wl,-soname,该选择告知链接器一个动态库的别名...$ gcc -shared -Wl,-soname,libalias.so -o libmod.so mod1.o mod2.o $ gcc -o resultant main.c libmod.so...上面命令使用libalias.so作为libmod.so的别名,再次运行resultant会提示找不到libalias.so错误而不是libmod.so,-soname别名引入一个中间层,好处是程序运行时可以使用和编译时不一样的兼容库

1.5K50

FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库

1、下载Linux版本的android-ndk-r21e登录Linux服务器(比如华为云的欧拉系统),依次执行下面的命令。...修改内容如下: (1)把几个sh文件里的下面这行SYSTEM=windows-x86_64改为下面这行,也就是把“windows”替换为“linux”SYSTEM=linux-x86_64(2)去掉几个...与在Windows环境交叉编译相比,Linux系统在编译x264前只要修改configure,不用改Makefile。...打开x264-master目录下的configure文件,把下面这行(一共有一模一样的两行,两行都要改,别漏了) echo "SONAME=libx264.so....$API" >> config.mak改为下面这行: echo "SONAME=libx264.so" >> config.mak保存并退出configure文件,再依次执行下面的编译命令:.

11410

Ubuntu 12.04 + opencv 2.4.1 + Qt 4.8.3 + Qt creater 2.5.2 安装配置

2.Qt库编译安装参考:http://www.linuxidc.com/Linux/2012-06/62606.htm 注意 ....Qt creater 安装参考http://www.linuxidc.com/Linux/2012-06/62607.htm 如果安装完出错想卸载,源文件是.bin,应该会有个uninstall文件,...libopencv_contrib.so \   /usr/local/lib/libopencv_calib3d.so include路径就不用解释了,按照共享库的命名惯例,每个共享库有三个文件名:real name、soname...soname是一个符号链接的名字,只包含共享库的主版本号,主版本号一致即可保证库函数的接口一致,因此应用程序的.dynamic段只记录共享库的 soname,只要soname一致,这个共享库就可以用。...要是嫌麻烦,直接在 /usr/local/Qt-4.8.3/mkspecs/linux-g++/qmake.conf 加入下面命令以及将上面的libs和include都加进去: QMAKE_INCDIR

1.6K100
领券