zoukankan      html  css  js  c++  java
  • linux下的库冲突问题

      lib1.c

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

    lib2.c

    #include <stdio.h>

    int fun1()
    {
    return 0;
    }

    int fun()
    {
    printf("lib2 ");
    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  也会出现重定义的错误,所以这个比较顺序还是拿库和符号表对比,而不是拿符号表和库对比。

  • 相关阅读:
    EXISTS 的使用
    bind()和 unbind()绑定解绑事件的使用
    前端代码
    LIKE CONCAT 连用
    客服工作台
    杂录
    vue
    咋乱杂乱的一些总结
    kotlin 很杂很杂
    group by 和 order by 的区别 + 理解过程
  • 原文地址:https://www.cnblogs.com/leo0000/p/5226869.html
Copyright © 2011-2022 走看看