• 链接详解--共享库


    组成共享库的目标文件和一般目标文件有所不同,在编译时要加-fPIC选项(生成与位置无关代码 Position Independent code)。

    $gcc -c -fPIC stack/stack.c stack/push.c stack/pop.c stack/is_empty.c

    一般目标文件称为Relocatable(可重定位文件),在链接时可以把目标文件中各段的地址做重定位。

    制作共享库:

    $gcc -shared -o libstack.so stack.o push.o pop.o is_empty.o

    共享库的搜索路径:

    $gcc main.c -g -L. -lstack -Istack -o main

    $./main

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

    ldd查看可执行文件依赖于哪些共享库:

    $ldd main

    共享库的搜索路径由动态链接器决定,从ld.so(8) Man page可以查到共享库路径的搜索顺序:

    1. 首先在环境变量LD_LIBRARY_PATH所记录的路径中查找。

    2. 然后从缓存文件/etc/ld.so.cache中查找。这个缓存文件由ldconfig命令读取配置文件/etc/ld.so.conf之后生成。

    3. 如果上述步骤都找不到,则到系统默认的路径中查找,/usr/lib,然后是/lib。

    添加搜索路径方法:

    1. $export LD_LIBRARY_PATH=. ./main 

        临时性,不推荐。

    2. 把动态库绝对路径添加到/etc/ld.so.conf中(每个路径一行),然后运行ldconfig。(推荐)

        ldconfig除了处理/etc/ld.so.conf中配置的目录之外,还处理一些默认目录,如/lib,/usr/lib等,    

        处理之后生成/etc/ld.so.cache缓存文件,动态链接器就从这个缓存中搜索共享库。

    3. 把共享库拷贝到/usr/lib或/lib目录。

    库链接顺序问题:

    1. http://adam8157.info/blog/2010/09/libraries-link-order/

    2. 链接时库的顺序问题

    3. undefined reference to: xxx

    4. 剖析共享程序库

  • 相关阅读:
    SSM框架搭建
    UML——类图
    javascript中的闭包(Closure)的学习
    JS和jQuery中ul li遍历获取对应的下角标
    jquery中防止冒泡事件
    chouTi
    DjangoForm 之创建FORM模板进行验证
    django学习日记-cookie
    同步锁
    进程线程
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/4878740.html
Copyright © 2020-2023  润新知