链接选项 rpath 的原理和应用

本文介绍了C++动态库在测试和部署时遇到的链接问题,特别是如何使用rpath来解决程序找不到依赖库的问题。通过示例说明了rpath的设置和作用,以及在Makefile和CMake中如何配置rpath。此外,还探讨了动态库与静态库的优缺点,强调了动态库在大型项目和插件开发中的重要性。
摘要由CSDN通过智能技术生成

女主宣言

在测试和部署 C++ 动态库时,经常遇到的问题就是程序链接到了系统路径下的动态库,有时候 make 编译时链接到本地路径的动态库,但实际 make install 时则会丢失这个依赖。本文将要介绍的就是一种通用解决方法,使用 RPATH 来绑定链接路径。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

1

动态库编译和使用简单示例

给出以下示例库:

// foo.h
#pragma once


#ifdef __cplusplus
extern "C" {
#endif


void foo();


#ifdef __cplusplus
}
#endif
// foo.cc
#include "foo.h"
#include <stdio.h>


void foo() { printf("foo\n"); }

生成动态库 libfoo.so:

g++ -o libfoo.so -fPIC -shared foo.cc

然后给出调用代码:

// main.cc
#include "foo.h"


int main(int argc, char* argv[]) {
  foo();
  return 0;
}

编译时链接到当前目录:

$ gcc main.c -L . -lfoo
$ ./a.out 
foo
$ ldd a.out | grep libfoo
  libfoo.so (0x00007fc2010f7000)

至此,一切正常。

2

依赖动态库的动态库

 

实际编写程序时,往往会依赖一些第三方库来避免重复造轮子。比如,这里我们要写一个库依赖于 libfoo.so。

目录层次:

.
├── include
│   └── bar.h
├── src
│   └── bar.cc
└── thirdparty
    ├── include
    │   └── foo.h
    └── lib
        └── libfoo.so

然后编译生成 libbar.so:

g++ -o libbar.so -fPIC -shared src/bar.cc \
  -I include/ -I thirdparty/include/ \
  -L thirdparty/lib/ -lfoo

问题来了,编译出的 libbar.so 找不到 libfoo.so 的依赖:

$ ldd libbar.so | grep foo
  libfoo.so => not found

当然,这样的话,你编译依赖 libbar.so 的程序时会直接失败,从

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值