文档章节

GCC/G++选项 -Wl,--rpath=

y
 yepanl
发布于 2018/10/07 19:38
字数 550
阅读 591
收藏 0

    我们知道,GCC/G++提供了-L选项用于链接时指定要链接的库的路径,但是这个选项只限于编译时,在运行时,可执行文件并未记住链接库的路径,因此在程序初始化的时候,动态加载程序会报告找不到动态库错误。

    示例代码如下:

    test.cc:

#include <iostream>

void dumpTest() {
    std::cout << "This is dumpTest" << std::endl;
}
 

    main.cc:

#include <iostream>

extern void dumpTest();
int main() {
    std::cout << "This is Linux platform" << std::endl;
    dumpTest();

    return 0;
}
    说明:test.cc编译成 libtest.so,main.cc链接 libtest.so生成可执行文件main。

    问题:

        使用如下命令编译main,在运行时报告找不到 libtest.so:

            g++ -L./yepanl -o main main.cc -ltest

        运行结果如下:

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

    解决办法一:

        设置运行时环境变量 LD_LIBRARY_PATH,这种情况适用于嵌入式运行等环境:

             export LD_LIBRARY_PATH=./yepanl:$LD_LIBRARY_PATH

    解决办法二:

        编译链接可执行文件时,增加 -Wl,--rpath=选项,链接器在可执行文件头中记录动态库的路径,动态加载器运行时读取动态库路径,加载动态库。这种情况适用于主机开发运行环境:

        g++ -L./yepanl -o main main.cc -ltest -Wl,--rpath=./yepanl

$ readelf -d main 

Dynamic section at offset 0xdf8 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libtest.so]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [./yepanl]
 0x000000000000000c (INIT)               0x4007c8
 0x000000000000000d (FINI)               0x400a74
 0x0000000000000019 (INIT_ARRAY)         0x600dd8
 0x000000000000001b (INIT_ARRAYSZ)       16 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x600de8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x400298
 0x0000000000000005 (STRTAB)             0x4004a8
 0x0000000000000006 (SYMTAB)             0x4002e0
 0x000000000000000a (STRSZ)              429 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x601000
 0x0000000000000002 (PLTRELSZ)           216 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x4006f0
 0x0000000000000007 (RELA)               0x4006c0
 0x0000000000000008 (RELASZ)             48 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x400680
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x400656
 0x0000000000000000 (NULL)               0x0
 

    总结:-L选项用于链接时搜索动态库,-Wl,--rpath=用于运行时搜索动态库。

© 著作权归作者所有

y
粉丝 2
博文 79
码字总数 106042
作品 0
南京
程序员
私信 提问
libtool的理解,转载

o: 编译的目标文件 -X/S3f m'S H ] X0 a: 静态库,其实就是把若干o文件打了个包 k z3n o U V p R0 so: 动态链接库(共享库)中国电子顶级开发网----最专业的电子论坛、最专业的电子工程师博客...

jlmpp
2011/02/16
305
0
Linux操作系统的头文件和库文件搜索路径

一、 头文件 1 “”中的头文件,在源文件当前目录查找 2 -I 中指定目录 -I可以在CFLAG中指定 3 gcc的环境变量 CINCLUDEPATH, CPLUSINCLUDEPATH, OBJCINCLUDEPATH 4 编译器预设路径、内定目录...

双月通天
2016/02/01
146
0
GCC/G++选项 -Wl,-Bstatic和-Wl,-Bdynamic

默认情况下,GCC/G++链接时优先链接动态库,如果没有动态库,则链接相应的静态库。同时,GCC/G++也提供了链接选项 -Wl,-Bstatic 和 -Wl,-Bdynamic 供用户指定链接动态库或者静态库。 -Wl,-B...

yepanl
2018/10/10
185
0
交叉编译提示.so文件不存在问题

Makefile中添加: LINK = arm-none-linux-gnueabi-g++ -Wl,--allow-shlib-undefined 就可以解决下面的错误信息,主要是红色部分。 /media/hdoc/qtsdk/arm9/arm-2009q1/bin/../lib/gcc/arm-non......

活的自由
2011/09/15
559
2
动态库的链接和链接选项-L,-rpath-link,-rpath

链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录,然后按照/etc/ld.so.conf里面的...

水海云
2013/03/22
23.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 磁盘不足异常

linux 报 No space left on device 异常 ,则是磁盘不足 ,导致异常 运行 df -h 命令查询磁盘使用率,如果有100%,则查找目录大日志文件删除 1.磁盘不足导致系统应用写入文件失败,如系统日志...

zaolonglei
26分钟前
3
0
即学即用的 30 段 Python 实用代码

☞ 分享:最全最新的Python学习大礼包 ☜ 点击查看 编译:Pita & AI开发者,作者:Fatos Morina Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许...

Object_Man
27分钟前
3
0
The server time zone value 'EDT' is unrecognized or represents more than one time zone.

2019-10-14 18:07:43.714 ERROR 74363 --- [Druid-ConnectionPool-Create-1855026648] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://10.30......

yizhichao
40分钟前
8
0
html加载顺序以及影响页面二次渲染额的因素

本文转载于:专业的前端网站➱html加载顺序以及影响页面二次渲染额的因素 浏览器请求发往服务器以后,返回HTML页面,页面内容开始渲染,具体的执行顺序为: 1. 浏览器开始载入html代码,发现<...

前端老手
43分钟前
9
0
BeginnersBook JSP、JSTL、Servlet 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
55分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部