当前位置:网站首页>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=.
边栏推荐
- oracle create user
- Software testing interview questions: What stages should a complete set of tests consist of?
- 2022 Hangzhou Electric Power Multi-School Session 3 Question B Boss Rush
- GO中sync包自由控制并发的方法
- 4. PCIe 接口时序
- E - Distance Sequence (prefix and optimized dp
- E - Many Operations (按位考虑 + dp思想记录操作后的结果
- 进程间通信和线程间通信
- 2022 Nioke Multi-School Training Session H Question H Take the Elevator
- 软件测试面试题:BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
猜你喜欢
刘润直播预告 | 顶级高手,如何创造财富
leetcode: 266. All Palindromic Permutations
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots
机器学习(公式推导与代码实现)--sklearn机器学习库
QSunSync Qiniu cloud file synchronization tool, batch upload
OPENWIFI实践1:下载并编译SDRPi的HDL源码
MongoDB搭建及基础操作
oracle create user
2022杭电多校第三场 K题 Taxi
could not build server_names_hash, you should increase server_names_hash_bucket_size: 32
随机推荐
2022 Multi-school Second Session K Question Link with Bracket Sequence I
FSAWS 的全球基础设施和网络
MBps与Mbps区别
2022杭电多校第一场 1004 Ball
JUC thread pool (1): FutureTask use
机器学习(公式推导与代码实现)--sklearn机器学习库
软件测试面试题:做好测试计划的关键是什么?
gorm联表查询-实战
面试汇总:为何大厂面试官总问 Framework 的底层原理?
软件测试面试题:设计测试用例时应该考虑哪些方面,即不同的测试用例针对那些方面进行测试?
tiup telemetry
"No title"
Software testing interview questions: What is the difference between load testing, capacity testing, and strength testing?
Mysql_13 事务
Software Testing Interview Questions: What aspects should be considered when designing test cases, i.e. what aspects should different test cases test against?
Software Testing Interview Questions: What do test cases usually include?
QSunSync Qiniu cloud file synchronization tool, batch upload
僵尸进程和孤儿进程
ORA-00257
D - I Hate Non-integer Number (count of selected number dp