【问题标题】:Linking a shared library with another shared lib in linux在linux中将共享库与另一个共享库链接
【发布时间】:2013-10-25 19:28:47
【问题描述】:

我正在尝试构建一个共享库。让我们说 libabc.so。它使用另一个 .so 文件,比如 lib123.so(/usr/local/lib 中的一个库)。现在我在我的应用程序中使用我的共享库 libabc.so。说 my-app。我想知道我应该如何链接这些二进制文件?我不想直接将 my-app 与 lib123.so 链接。 my-app 应该只与 libabc.so 链接。我该怎么做?

提前致谢。我正在使用 g++ 编译器

【问题讨论】:

  • 您是否考虑过使用自动化构建系统,例如 autotools? autotools 带有 libtool,它可以消除构建共享库所需的大部分尴尬处理。
  • @nyarlathotep:您建议与静态lib122.a 共享libabc.so 链接是错误的
  • 显示您的准确构建命令(用于目标文件和共享库)。

标签: c++ c linux linker shared-libraries


【解决方案1】:

假设libabc.so是从posiition independent目标代码文件abc1.pic.oabc2.pic.o中得到的;然后你用例如构建它们

 gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
 gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o

然后你用

构建libabc.so
gcc -shared  abc1.pic.o  abc2.pic.o -L/usr/local/lib -l123 -o libabc.so

我添加了-L/usr/local/lib 之前 -l123 因为我假设你有一个/usr/local/lib/lib123.so 共享库。

另请阅读Program Library HowTo

如您所见,您可以将共享库 lib123.so 链接到您自己的共享库 libabc.so

然后检查ldd libabc.so

您可能希望通过将-Wl,-rpath-Wl,$RPATHDIR 添加到链接命令来在您的libabc.so 中设置一些rpath

更多详情,请阅读 Drepper 的论文How to write shared libraries

PS。不要为lib123.a 使用静态库(它应该是 PIC)。如果将非 PIC 代码链接到共享对象,您将失去共享对象的大部分优势,并且动态链接器 ld.so 必须进行无数次重定位。

【讨论】:

  • 我做了和你在这里提到的完全一样的事情。但是当我在 libabc.so 上做一个 ldd 时,它没有列出 lib123.so。你知道为什么会这样吗?
  • 为什么不是 lib123 的静态库?如果不是 PIC 怎么办?
  • 我无能为力,除非您显示至少精确命令参与构建您的abc*.pic.o 对象和libabc.so 库。
  • @BЈовић:因为静态库通常不是 PIC,基本上是成员对象文件的串联。
  • 拜托,请编辑您的问题。您上面的 cmets 几乎无法读取!
【解决方案2】:

按照Basile Starynkevitch 指出的相同过程,例如,我有一个依赖于libm.so 的库,因此库对象的编译是:

gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c  -o build/arm/wavegen.o                                                                                          
gcc -fPIC -Wall -g -I include -I src -c src/serial.c  -o build/arm/serial.o

然而,为了编译库,在某些版本的 gcc 中,库引用的放置顺序很重要,所以我建议,为了确保兼容性,将这些引用放在命令的末尾:

gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm

我已经在 PC (gcc v.8.3.0) 和 ARM (gcc v.4.6.3) 中进行了测试。

【讨论】:

    【解决方案3】:

    在尝试创建我自己的使用 Berkeley DB 的共享库时,我发现我必须将 -ldb 放在 gcc 命令的末尾,否则它会说找不到符号“db_create”。这是在 Cygwin 下。

    具体来说,这是有效的:

    gcc -shared -o $b/$libfile nt_*.o -ldb

    这不起作用:

    gcc -ldb -shared -o $b/$libfile nt_*.o

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多