一、动态库的链接和链接选项-L,-rpath-link,-rpath

  (1). 现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,

    用户可以通过-L指定连接时库的路径,

    通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。

Link-time path -L指定连接时库的路径 -L
Run-time path -R(或-rpath)指定程序运行时库的路径 -rpath-link
-rpath

  比如我们做嵌入式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),

  将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

  链接器ld的选项有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是这个意思:

  • -L:  “链接”的时候,去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L 指定的目录去找,然后是默认的地方。

      编译时的-L选项并不影响环境变量LD_LIBRARY_PATH, -L 只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,

      系统还是会到默认路径下查找该程序所需要的库,如果找不到,还是会报错,类似cannot open shared object file。

  • -rpath-link:这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,

         这个时候,会先从 -rpath-link 给的路径里找。

  • -rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。

      对于交叉编译,交叉编译链接器需已经配置 –with-sysroot 选项才能起作用。

      也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时查找需要加载的动态库。-rpath-link 则只用于链接时查找。

  (2).  在gcc中使用ld链接选项时,需要在选项前面加上前缀-Wl(是字母l,不是1),     

  if the linker is being invoked indirectly,via a compiler driver(gcc)then all the linker command line options should be prefixed by -Wl, 
  (or whatever is appropriate for the particular compiler driver) like this:
  <!-- lang: shell -->
  gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
  This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link.

    The -Wl,xxx option for gcc passes a comma-separated list of tokens as a space-separated list of arguments to the linker. So

        gcc -Wl,aaa,bbb,ccc

    eventually becomes a linker call

        ld aaa bbb ccc

    In your case, you want to say "ld -rpath .", so you pass this to gcc as -Wl,-rpath,.Alternatively, you can specify repeat instances of -Wl:

        gcc -Wl,aaa, -Wl,bbb -Wl,ccc

    Or, in your case,

        -Wl,-rpath -Wl,.

(3).  直接 man ld 查看详细文档

Linux ToolChain (二) --- Linker (1)链接选项 -L -rpath -rpath-link的更多相关文章

  1. 动态库的链接和链接选项-L,-rpath-link,-rpath

    https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行 ...

  2. ld 链接选项-L,-rpath-link,-rpath

    转载自:http://blog.csdn.net/q1302182594/article/details/42102961 1. 三个C文件 1. world.c #include<stdio. ...

  3. GCC 中 -L、-rpath和-rpath-link的区别

    GCC 中 -L.-rpath和-rpath-link的区别 来源 http://blog.csdn.net/q1302182594/article/details/42102961 关于这3个参数的 ...

  4. Linux C/C++ 链接选项之静态库--whole-archive,--no-whole-archive和--start-group, --end-group

    参照这两篇博客: http://stackoverflow.com/questions/805555/ld-linker-question-the-whole-archive-option http: ...

  5. 【转】Linux下软、硬链接的创建和删除

    原文:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/05/2199534.html 在Linux系统中,内核为每一个新创建的文件分 ...

  6. linux下软、硬链接的创建和删除

    linux下软.硬链接的创建和删除 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复 ...

  7. Linux 运维之硬链接与软链接详解

    了解这个的时候不如先知道下文件吧. 我们知道文件都有文件名与数据,但是呢这个在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata). 用户数据,即文件数据块 ...

  8. .Net程序员学习Linux(二)

    本次知识点:递归命令符,wc命令,文档编辑器 vi的简单使用,文本常用操作命令,find查询文件命令,grep匹配文本中对应的关键字 递归命令符 递归对于程序猿来说不默认,经常用于级联关系,一层套一层 ...

  9. Linux下,连接器ld链接顺序的总结

    原来ld对于链接一系列的库的顺序是很敏感的,不然会报undefined referenced 的函数符号错误,意思就是未找到函数定义.实际上库是能正确打开的.如果库libA.a依赖于库libB.a,那 ...

随机推荐

  1. android 两种定时器的实现

    在Android上常用的定时器有两种,一种是Java.util.Timer,一种就是系统的AlarmService了. 实验1:使用Java.util.Timer. 在onStart()创创建Time ...

  2. iOS 模拟器上录制Demo视频

    在App审核中会让用户上传一段简易的视频,那么如何制作改视频呢? 今天无意中在Cocochina 中看到 说利用QuickTime来制作,而QuickTime是操作系统自带的. 哦 My,God ! ...

  3. webshell

    webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下 ...

  4. Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

     Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四) 在Android Priority Job Queue (Jo ...

  5. ecshop安装常见问题及解决办法

    一,Ecshop首页出现报错:Only variables should be passed by referen 最近想安装一个ECSHOP商城上去,老是报错,出现下面这就话: Strict Sta ...

  6. request获取url的方法总结

    辣么多属性.方法  不用就忘了  ,当需要用的时候挠头也想不到,现在总结一下 以备用 例如:http://localhost/testweb/default.aspx 1.Request.Applic ...

  7. jQuery 获取父窗口的元素 父窗口 子窗口(iframe)

    $("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...

  8. Downloader调用WCF服务返回文件

    Generator using System; using System.Collections.Generic; using System.IO; namespace Downloader { pu ...

  9. 转载:使用命令行启动VirtualBox虚拟机

    使用命令行启动VirtualBox虚拟机 装上VirtualBox就琢磨着如何让它开机自动启动,又或者能够通过命令行的形式直接启动指定的虚拟机. 看了下VirtualBox的官方文档,发现有一个命令可 ...

  10. vs2010中使用Nunit测试c#代码结果的正确性

    本文转载自:http://blog.csdn.net/pukuimin1226/article/details/8112151 http://www.nunit.org/index.php?p=dow ...