gcc中的-Wl,rpath

转载:https://blog.csdn.net/GVFDBDF/article/details/52457139

GCC编译器一些参数区别(-I -l -L)


我们用gcc编译程序时,常常会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:

例:

gcc -o hello hello.c   -I/home/hello/include   -L/home/hello/lib    -lworld
  • 1

上面这句表示在编译hello.c时:

  • -I /home/hello/include,表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include

    • 也就是指定优先查找的目录,找不到的话查找默认目录
  • -L /home/hello/lib,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib

    • 同上,也是指定优先查找的目录
  • -l word , 表示**寻找动态链接库文件**libword.so(也就是文件名去掉前缀和后缀所代表的库文件)

    • 如果 加上编译选项-static,表示寻找静态链接库文件,也就是libword.a

对于第三方提供的动态链接库(.so),一般将其拷贝到一个lib目录下(/usr/local/lib),或者使用-L来指定其所在目录, 然后使用-l来指定其名称


gcc中的-Wl,rpath=<your_lib_dir>选项

gcc编译链接动态库时,很有可能编译通过,但是执行时,找不到动态链接库,那是

因为-L选项指定的路径只在编译时有效,编译出来的可执行文件不知道-L选项后面的值,

当然找不到。可以用ldd <your_execute>看看是不有 ‘not found’在你链接的库后面,

解决方法是通过-Wl,rpath=<your_lib_dir>,使得execute记住链接库的位置



转载:https://blog.csdn.net/cjf_iceking/article/details/25219675

链接选项rpath,容易被忽略的一个功能


问题来源

最近在做一个项目的客户端的SDK,实现为一个动态链接库,其依赖于其他的若干个动态库文件。那么在利用SDK开发应用程序的时候,编译的时候除了链接SDK库本身,还得链接SDK库所依赖的库,这样编译命令里面得一一的添加这些库。 

比如,SDK库的名称为liba.so, 其依赖于libb.so和libc.so,那么在编译应用程序的时候使用以下命令:

+++++++++++++++++++++++++++++++++++++++++++++

gcc -o test test.c -I. -L. -la -lb -lc

+++++++++++++++++++++++++++++++++++++++++++++

但是如果将SDK库即liba.so交给其他的开发人员,其他的开发人员可不想编译的时候,显示的链接liba.so所依赖的库。他们更愿意编译的时候,只显示地链接liba.so。

那么该怎么做呢?利用rpath这个链接选项!


解决方法

首先来man ld,查找链接选项rpath的含义:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 -rpath dir
           Add  a  directory to the runtime library search path.  This is used when linking an ELF executable with
           shared objects.  All -rpath arguments are concatenated and passed to the  runtime  linker,  which  uses
           them  to locate shared objects at runtime.  The -rpath option is also used when locating shared objects
           which are needed by shared objects explicitly  included  in  the  link
;  see  the  description  of  the
           -rpath-link option.  If -rpath is not used when linking an ELF executable, the contents of the environ-
           ment variable "LD_RUN_PATH" will be used if it is defined.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

简单翻译下, rpath链接选项主要有两个功能:

(1)程序运行时,优先到rpath指定的目录去寻找依赖库

(2)程序链接时,在指定的目录中,隐式的链接那些动态库所需要的链接库。

往往我们都熟知第一个功能,忽略第二个功能。而第二个功能正是现在所需要的。

我们将liba.so,libb.so 和 libc.so拷贝的同一个目录中,然后利用rpath链接应用程序,这样编译便不需要显示的去链接liba.so所依赖的库了。

+++++++++++++++++++++++++++++++++++++++++++++

gcc -o test test.c -I. -L. -la -Wl,-rpath=.

+++++++++++++++++++++++++++++++++++++++++++++

展开阅读全文

没有更多推荐了,返回首页