当前位置:网站首页>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 visual management software Redis Desktop Manager2022
- GCC:屏蔽动态库之间的依赖
- The principle of NMS and its code realization
- 国内网站用香港服务器会被封吗?
- MongoDB construction and basic operations
- 翁恺C语言程序设计网课笔记合集
- matlab 采用描点法进行数据模拟和仿真
- 2022多校第二场 K题 Link with Bracket Sequence I
- oracle create user
- "WEB Security Penetration Testing" (28) Burp Collaborator-dnslog out-band technology
猜你喜欢
随机推荐
[idea] idea configures sql formatting
进程间通信和线程间通信
Mysql_13 事务
2022 Nioke Multi-School Training Session 2 J Question Link with Arithmetic Progression
leetcode:267. 回文排列 II
Software testing interview questions: the difference and connection between black box testing, white box testing, and unit testing, integration testing, system testing, and acceptance testing?
软件测试面试题:请你分别画出 OSI 的七层网络结构图和 TCP/IP 的四层结构图?
E - Many Operations (按位考虑 + dp思想记录操作后的结果
MBps与Mbps区别
PCIe 核配置
软件测试面试题:手工测试与自动测试有哪些区别?
翁恺C语言程序设计网课笔记合集
软件测试面试题:软件都有多少种分类?
软件测试面试题:什么是软件测试?软件测试的目的与原则?
tiup status
Will domestic websites use Hong Kong servers be blocked?
CNI(Container Network Plugin)
D - I Hate Non-integer Number (选数的计数dp
tiup update
Raw and scan of gorm









](/img/4d/2d81dc75433c23c5ba6b31453396f0.png)