GCC链接选项-L,-rpath-link和-rpath

时间:2021-08-07 09:16:20


原文链接http://blog.csdn.net/openme_openwrt/article/details/7860580


OpenWrt中编译qtopia和qte2是会找不到uuid的库,需要特别地使用-luuid来指定,即使用-L$(dir) -luuid。

然而如果使用-Wl,-rpath-link=$(dir)选项,则会自动搜索libuuid.so进行链接。



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

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

-rpath_link (或者 -rpath-link):这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找。
-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找。对于交叉编译,只有配合 --sysroot 选项才能起作用。

也就是说,-rpath指定的路径会被记录在生成的可执行程序中,用于运行时。

-rpath-link 则只用于链接时。


清楚了这两个option的含义之后,来看用法,要在gcc的命令行中直接使用这两个option,必须遵循语法:-Wl,......。比 如:-Wl,--rpath-link/opt/alp/lib。-Wl就是告诉gcc,后面的内容是传递给linker的option。如果直接使用ld的话,就不需要-Wl,了。所以,上面我们的编译命令就变成这样,就OK了:

gcc -Wall -g -o rtspplayer-Wl,--rpath-link /opt/alp/lib `pkg-config --cflags --libs gtk+-2.0`-I/usr/include/gstreamer-0.10 -L/opt/alp/lib -lGSTfusion -lalp_mediamain.c gstplay.c gstplay-marshal.c

这样,再次将生成的rtspplayer拷贝到手机中就可以运行了,不会再说找不到fbsink element了。

这里是gcc命令行中给assembler, preprocessor, linker传递option的具体关键字列表:

Code: Select all
  -Wa,<options>            Pass comma-separated <options> on to the assembler
  -Wp,<options>            Pass comma-separated <options> on to the preprocessor
  -Wl,<options>            Pass comma-separated <options> on to the linker



此外,定义LD_LIBRARY_PATH也是可以的。这样就不用加-Wl,--rpath-link /opt/alp/lib这个内容了。具体的ld是如何查找动态链接库的逻辑,请看man ld中有关-rpath, -rpath-link这两部分的详细解释。