当前位置:网站首页>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=.
边栏推荐
- CNI(Container Network Plugin)
- Software Testing Interview Questions: What do test cases usually include?
- Will domestic websites use Hong Kong servers be blocked?
- 软件测试面试题:网络七层协仪具体?
- oracle创建用户
- ORA-00257
- [230]连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots
- 面试汇总:为何大厂面试官总问 Framework 的底层原理?
- leetcode: 267. Palindromic permutations II
- The method of freely controlling concurrency in the sync package in GO
猜你喜欢
随机推荐
ora-01105 ora-03175
5.PCIe官方示例
《WEB安全渗透测试》(28)Burp Collaborator-dnslog外带技术
JUC thread pool (1): FutureTask use
leetcode: 266. All Palindromic Permutations
tiup telemetry
二叉树[全解](C语言)
tensor.nozero(), mask, [mask]
Software Testing Interview Questions: What is Software Testing?The purpose and principle of software testing?
oracle create tablespace
Software testing interview questions: What are the strategies for system testing?
阶段性测试完成后,你进行缺陷分析了么?
tiup uninstall
Raw and scan of gorm
软件测试面试题:做好测试计划的关键是什么?
如何用 Solidity 创建一个“Hello World”智能合约
Software Testing Interview Questions: What Are the Types of Software Testing?
机器学习(公式推导与代码实现)--sklearn机器学习库
tiup status
node uses redis