gcc -L、-Wl,-rpath, -Wl,-rpath-link的区别

现要在目录 mainDir 下编译库libmain.so, 但是其 ---依赖于---> libsub.so,sub.so在目录 mainDir / subDir 下,且subDir不在LD_LIBRARY_PATH以及环境变量中。

现有如下执行:

  1. gcc -share -o libmain.so  main.o

    此命令可编译并链接通过,利用ldd libmain.so时没有发现有对libsub.so的依赖,但是ldd -r libmain.so时会发现会有sub库中的函数出现undefined symbol。

    因为libmain.so 依赖于 libsub.o,但是链接时没有添加lsub。

  2.gcc -share -lsub -o libmain.so  main.o

    此命令无法通过编译,会提示/usr/bin/ld: cannot find -lsub。

    因为libsub.so在目录subDir下,而subDir不在LD_LIBRARY_PATH和环境变量中。所以在链接时,gcc无法找到libsub.so。

  3.gcc -share -L./subDir -lsub -o libmain.so  main.o

    此命令可编译并链接通过,但是ldd -r libmain.so时会发现 libsub.so => not found。因为 libsub.o在目录subDir下。

  4.gcc -share -Wl,-rpath-link=‘./subDir‘  -L./subDir -lsub -o libmain.so  main.o

    此命令可编译并链接通过,但是在ldd -r libmain.so时还是会发现 libsub.so => not found。

  5.gcc -share -Wl,-rpath=‘./subDir‘  -L./subDir -lsub -o libmain.so  main.o

    此命令可编译并链接通过,而且ldd -r libmain.so也会发现对libsub.so的依赖。

总结:

  -L:只是在编译时指定库的位置,但是运行时无法找到该位置;

  -rpath和-rpath-link都可以在链接时指定库的路径。

    但是运行时,-rpath-link指定的路径就不再有效,因为链接器没有将库的路径包含进可执行文件中或库中;

    而-rpath指定的路径,已被链接器写入可执行文件中或库中

原文地址:https://www.cnblogs.com/zhchy89/p/10529512.html

时间: 2024-11-09 02:41:38

gcc -L、-Wl,-rpath, -Wl,-rpath-link的区别的相关文章

GCC -l

GCC   -l  option is to link the library. It can use for static and share link.  Link -l with library name without the lib prefix and the .a or .so extensions. Static : gcc   -static -ltest xx.c, it will link with libtest.a share : gcc –ltest xx.c it

gcc -l -L -I -include 参数

gcc -l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,

@import和link的区别

@import和link的区别 1.link语法结构    <link href="CSSurl路径" rel="stylesheet" type="text/css" />    此标签是引入CSS文件link标签,只要设置好路径即可. 2.@import语法结构    @import + 空格+ url(CSS文件路径地址);    1).在html中        <style type="text/css&qu

angularjs compine和link的区别

[译]ng指令中的compile与link函数解析 04 September 2014 通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. 原文地址 angularjs里的指令非常神奇,允许你创建非常语义化以及高度重用的组件,可以理解为web components的先驱者. 网上已经有很多介绍怎么使用指令的文章以及相关书籍,相互比较的话,很少有介绍compile与link的区别,更别说pre

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

https://my.oschina.net/shelllife/blog/115958 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置.linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径.同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.

gcc -l参数和-L参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.

GCC --verbose选项, -lpthread 和-pthread的区别

verbose的意思是冗长的,繁杂的.顾名思义,gcc --verbose 的意思就是打印出编译连接时的详细信息. 参考stackoverflow中的文章结合自己机器的信息给出分析(其实也就是翻译了一下..嘿嘿.  原址:http://stackoverflow.com/questions/13440549/gcc-verbose-mode-output-explanation) 首先给出整体信息: [email protected]:~/APUE3/Chapter11$ gcc printid

gcc g++支持C++11 标准编译及其区别

g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:http://stackoverflow.com/questions/16886591/how-do-i-enable-c11-in-gcc 方法1:写Makefile 方法2:取别名 :alias g++11="g++ -std=c++11" -----------------------

Ubuntu中的两种link的区别

Ubuntu中有两种link(windows世界中文件的"快捷方式"),一个是hard link(硬链接),另一个是symbolic link(软链接). 那么,什么是硬链接,什么又是软链接呢? 硬链接(hard link) 简单的说,硬链接会链接到目标文件的内容,即便目标文件在链接之后被改了名字,又或者被删掉了,硬链接以及硬链接的目标内容依然存在且有效.我们来做个实验. 实验过程设计: 1.创建一个文本文件origin: 2.向origin文件中写入内容"lorem ips