当前位置:网站首页>GCC:屏蔽动态库之间的依赖
GCC:屏蔽动态库之间的依赖
2022-08-05 00:40:00 【风静如云】
假设有如下依赖关系的一个程序:
m 依赖于a
a 依赖于b
//a.c
#include <stdio.h>
void b();
void a()
{
printf("Here is a call b\n");
b();
//b.c
#include <stdio.h>
void b()
{
printf("Here is b\n");
//m.c
#include <stdio.h>
void a();
int main()
{
a();
return 0;
已经说明此程序应该编译连接。
但是这里有一个地方并不是十分的方便,就是m从表面上看只依赖a,却需要将a依赖的b在编译连接时也加入,方可运行。对于一个比较复杂的程序,那么就需要不断的查看程序,才能确认最终需要编译连接的库都有什么,及其的不方便。
那么可不可以将a的依赖需要放入a的编译过程中呢:
gcc -fpic -shared a.c -o liba.so -lb -L .
gcc -o m m.c -la -L.
由于连接时库a需要库b,却无法找到,因此报错:
/usr/bin/ld: warning: libb.so, needed by ./liba.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: ./liba.so: undefined reference to `b'
collect2: error: ld returned 1 exit status
ldd liba.so
linux-vdso.so.1 (0x00007ffecb1fd000)
libb.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ba19ad000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2ba1bb7000)
可见这种方式行不通。
解决这个问题可以通过-Wl,-rpath=
-WL:表示编译器将后面的参数传递给链接器ld
-rpath:用于指定编译连接和运行时依赖的路径
因此编译a时可以通过如下方式,将其依赖的b加入:
gcc -fpic -shared a.c -o liba.so -lb -Wl,-rpath=.
gcc -o m m.c -la -L .
注:以上编译后,运行时可能会报错:
./m: error while loading shared libraries: liba.so: cannot open shared object file: No such file or directory
其原因是在运行时无法找到liba.so
解决这个问题有两个方法:
1.通过设置LD_LIBRARY_PATH
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
2.编译m时也指定 -Wl,-rpath=,即:
gcc -o m m.c -la -Wl,-rpath=.
边栏推荐
- 软件测试面试题:设计测试用例时应该考虑哪些方面,即不同的测试用例针对那些方面进行测试?
- what?测试/开发程序员要被淘汰了?年龄40被砍到了32?一瞬间,有点缓不过神来......
- 2022杭电多校 第三场 B题 Boss Rush
- QSunSync Qiniu cloud file synchronization tool, batch upload
- 软件测试面试题:什么是软件测试?软件测试的目的与原则?
- 软件测试面试题:软件都有多少种分类?
- Software Testing Interview Questions: About Automated Testing Tools?
- 2022牛客多校第三场 A Ancestor
- 倒计时1天!8月2日—4日与你聊聊开源与就业那些事!
- 僵尸进程和孤儿进程
猜你喜欢

could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

电子行业MES管理系统的主要功能与用途

2 用D435i运行VINS-fusion

Inter-process communication and inter-thread communication

Matlab uses plotting method for data simulation and simulation

oracle create user

matlab 采用描点法进行数据模拟和仿真

【idea】idea配置sql格式化

Mysql_13 事务

《WEB安全渗透测试》(28)Burp Collaborator-dnslog外带技术
随机推荐
gorm joint table query - actual combat
Mysql_12 多表查询
2022 Nioke Multi-School Training Session 2 J Question Link with Arithmetic Progression
matlab中rcosdesign函数升余弦滚降成型滤波器
2 用D435i运行VINS-fusion
Software Testing Interview Questions: What do test cases usually include?
About I double-checked and reviewed the About staff page, returning an industry question
【unity编译器扩展之模型动画拷贝】
软件基础的理论
gorm联表查询-实战
oracle创建用户
软件测试面试题:请你分别画出 OSI 的七层网络结构图和 TCP/IP 的四层结构图?
国内网站用香港服务器会被封吗?
oracle create tablespace
BC(转)[js]js计算两个时间相差天数
仅3w报价B站up主竟带来1200w播放!品牌高性价比B站投放标杆!
The principle of NMS and its code realization
标识符、关键字、常量 和变量(C语言)
Matlab uses plotting method for data simulation and simulation
软件测试面试题:设计测试用例时应该考虑哪些方面,即不同的测试用例针对那些方面进行测试?