当前位置:网站首页>GCC: Shield dependencies between dynamic libraries
GCC: Shield dependencies between dynamic libraries
2022-08-05 00:44:00 【calm as a cloud】
Assume a program with the following dependencies:
m depends on a
a depends on b
//a.c#include void b();void a(){printf("Here is a call b\n");b(); //b.c#include void b(){printf("Here is b\n"); //m.c#include void a();int main(){a();return 0; GCC: Compile-time library path and runtime library path - Programmer Sought
It has been stated that this program should compile and link.
But there is a place that is not very convenient, that is, m only depends on a on the surface, but it needs to add the b that a depends on when compiling and linking, so that it can run.For a more complex program, it is necessary to constantly check the program to confirm what the libraries that need to be compiled and linked finally have, and it is inconvenient.
Then is it possible to put the dependencies of a into the compilation process of a:
gcc -fpic -shared a.c -o liba.so -lb -L .
gcc -o m m.c -la -L.
Because library a needs library b when connecting, but cannot find it, an error is reported:
/usr/bin/ld: warning: libb.so, needed by ./liba.so, not found (try using -rpathor -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)
It can be seen that this method does not work.
This problem can be solved by -Wl,-rpath=
-WL: Indicates that the compiler will pass the following parameters to the linker ld
-rpath: The path used to specify the compile link and runtime dependencies
Therefore, when compiling a, you can add the b it depends on in the following way:
gcc -fpic -shared a.c -o liba.so -lb -Wl,-rpath=.
gcc -o m m.c -la -L .
Note: After the above compilation, an error may be reported at runtime:
./m: error while loading shared libraries: liba.so: cannot open shared object file: No such file or directory
The reason is that liba.so cannot be found at runtime
There are two ways to solve this problem:
1. By setting LD_LIBRARY_PATH
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
2. Also specify when compiling m -Wl,-rpath=, that is:
gcc -o m m.c -la -Wl,-rpath=.
边栏推荐
猜你喜欢

redis可视化管理软件Redis Desktop Manager2022

"WEB Security Penetration Testing" (28) Burp Collaborator-dnslog out-band technology

could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

SV class virtual method of polymorphism

Mysql_13 事务

oracle创建用户

翁恺C语言程序设计网课笔记合集

TinyMCE disable escape
![[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots](/img/fa/5bdc81b1ebfc22d31f42da34427f3e.png)
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots

5.PCIe官方示例
随机推荐
torch.autograd.grad求二阶导数
2022牛客多校第三场 J题 Journey
2022 The Third J Question Journey
OPENWIFI实践1:下载并编译SDRPi的HDL源码
Software testing interview questions: What are the three modules of LoadRunner?
gorm联表查询-实战
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots
NMS原理及其代码实现
Raw and scan of gorm
倒计时1天!8月2日—4日与你聊聊开源与就业那些事!
leetcode: 266. All Palindromic Permutations
软件测试面试题:软件测试类型都有哪些?
阶段性测试完成后,你进行缺陷分析了么?
oracle创建用户
PCIe 核配置
tensor.nozero(), mask, [mask]
redis可视化管理软件Redis Desktop Manager2022
tiup status
软件测试面试题:网络七层协仪具体?
软件测试面试题:您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程?