【问题标题】:About compile with .so in Linux关于在 Linux 中使用 .so 编译
【发布时间】:2014-06-09 20:59:08
【问题描述】:

我开发了一个共享库B.so,它依赖于A.so。 当我使用B.so编写程序test.exe时,但出现编译错误,它说找不到某些符号(符号在A.so中)。 我的构建线:

gcc test.c -o test.exe -fPIC -I./ -L./ -lB

我们有没有方法,如何成功构建test.exe,但不能链接A.so。

【问题讨论】:

  • 您是否也尝试过与A 链接?
  • 是的,如果我添加 A.so 就可以了。我想构建一个 SDK b.so,但是我不想构建 test.exe 需要 A.so
  • 所以您希望 A 库中的符号(变量/函数/等)神奇地出现在与库 B 链接的任何内容中?对于大多数编译器来说,这不太可能。不过,您可能会将 A 完全包含在 B 中以解决这个问题...
  • @twalberg 前段时间 GNU ld 在这种情况下有不同的行为,它确实自动链接到 A.so。但它不再这样做了。

标签: c linux shared-libraries .a


【解决方案1】:

如何成功构建test.exe,但无法链接A.so。

至少有两种方法:

  1. 导出正确的LD_LIBRARY_PATH

    export LD_LIBRARY_PATH=/path/to/A
    gcc ... -lB
    
  2. 使用ld选项-rpath(由提问者@iceKing自己发现)

    gcc -Wl,-rpath=/path/to/A ...
    

在这两种情况下,ld 都会自动搜索这些库列表所依赖的库。

【讨论】:

  • 感谢您的回复。但是在构建 B.so 时,我使用链接“-lrt -lcurl”,但是在构建 test.exe 时,不需要它们?为什么?
  • @iceKing 你真的在你的B.so 中使用了来自libcurl.so 的函数吗?
  • 是的,也许它选择了静态库。
  • 我有另一种方法,但我不知道为什么。我将 A.so 复制到构建文件夹,并添加标志“-Wl,-rpath=”。则编译成功。
  • @iceKing 如果您想了解,请查看ld 手册页中对-rpath 选项的说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多