lib1.c

#include <stdio.h>
int fun()
{
printf("lib1\n");
return 0;
}

lib2.c

#include <stdio.h>

int fun1()
{
return 0;
}

int fun()
{
printf("lib2\n");
return 0;
}

test.c

#include <stdio.h>
int fun();
int fun1();
int main()
{
fun1();
fun();
}

生成库liblib1.a和liblib2.a

当这样编译test时,gcc test.c -L. -llib2 -llib1 不会发生编译出错

而gcc test.c -L. -llib1 -llib2时

会出现以下编译错误:

./liblib2.a(lib2.o): In function `fun':
lib2.c:(.text+0xa): multiple definition of `fun'
./liblib1.a(lib1.o):lib1.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status

因为对ld的实现不是很清楚,猜测如下,先将符号表写好,然后按照各个库的顺序查找符号,直到满足所有的符号,后面的库忽略,这就使得第一种情况不会出错,但在定位符号时,应该是将符号表中的所有符号和库中的符号对比,这就导致了第二种情况,而不是已找到符号的不再后面的库中继续查找。

当在两个实现文件中再添加一个同名函数fun2时,但是test.c并未调用fun2  也会出现重定义的错误,所以这个比较顺序还是拿库和符号表对比,而不是拿符号表和库对比。

linux下的库冲突问题的更多相关文章

  1. 谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH

    谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.ph ...

  2. Linux下动态库生成和使用

    Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...

  3. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...

  4. 查看Linux下*.a库文件中文件、函数、变量

    查看Linux下*.a库文件中文件.函数.变量等情况在Linux 下经常需要链接一些 *.a的库文件,那怎么查看这些*.a 中包 含哪些文件.函数.变量: 1. 查看文件:ar -t xxx.a 2. ...

  5. Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so

    Linux下的库操作工具-nm.ar.ldd.ldconfig和ld.so .nm [options] file 列出file中的所有符号 [option] -c 将符号转化为用户级的名字 -s 当用 ...

  6. linux下静态库和动态库一些东西

    http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux  动态链接库和静态库示例 文件预览 文件目录树如下, ...

  7. 转:linux下共享库的注意点之-fpic

    转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...

  8. 深入理解LINUX下动态库链接器/加载器ld-linux.so.2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

  9. 【Linux开发】Linux下jpeglib库的安装详解

    Linux下jpeglib库的安装详解 首先要下载所需的库压缩包:jpegsrc.v6b.tar.gz或 jpegsrc.v8b.tar.gz 然后将下载的压缩包随便放在和解压到你喜欢的地方. # t ...

随机推荐

  1. Spring mvc web 配置

    Spring Framework本身没有Web功能, Spring MVC使用WebApplicationContext类扩展ApplicationContext ,使得拥有web功能.那么,Spri ...

  2. MySQL@淘宝 资料分享

    MySQL@淘宝 在过去两年, 淘宝数据库团在MySQL.SSD.开源迈出了巨大的步伐,截至11年十月用户数据库库.商品库.交易库都已经稳定的运行在MySQL上,同时也经历的双十一,双十二的考验.这里 ...

  3. POJ 1258 Agri-Net(最小生成树 Prim+Kruskal)

    题目链接: 传送门 Agri-Net Time Limit: 1000MS     Memory Limit: 10000K Description Farmer John has been elec ...

  4. PMD使用提醒

    1.注册登录后进入主界面,向右滑动出现侧滑栏 2.点击蓄水球进行每日目标设定 3.设置计时失败发送朋友圈内容 ~~~~~开始体验吧!!!

  5. hdu 2010 - 水仙花数

    题意: 数学上有个水仙花数,他是这样定义的:"水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3.现在要求输出所有在m和n范围内的水仙花 ...

  6. JavaScript杂谈(顺便也当知识积累)

    JavaScript版本 JavaScript的普及使得其于1997年正式成为国际标准,其官方名称为ECMAScript 1999年定稿第三版ECMAScript标准,简称ES3 2009年重大改进的 ...

  7. 在浏览器输入 URL 后会发生什么?超级详细介绍

    一个古老的面试问题:当你在浏览器中输入whosmall.com并且按下回车之后发生了什么? 不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节. 这将是一个协作的过程,所以深入挖 ...

  8. Java线程操作方法

    取得和设置线程名称 //================================================= // File Name : Thread_demo //--------- ...

  9. cmd 导出目录树

    cmd: tree /f >tree.txt

  10. LaTex数学符号

    http://web.ift.uib.no/Teori/KURS/WRK/TeX/symALL.html