【问题标题】:g++ not find .so filesg++ 找不到 .so 文件
【发布时间】:2016-05-14 10:01:17
【问题描述】:

我正在尝试使用 g++ 编译器生成一个 c++ 库。我的库有另一个 C 库作为依赖项,我已经编译它以获得 .so 文件。

我有以下结构:

src:
    include/linux:
        libcustom.a
        libcustom.la
        libcustom.so
        libcustom.so.0
        libcustom.so.0.0.0

现在,当我拥有我的 cpp 类的所有 .o 文件,并且我想链接库时,我执行以下命令:

g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o mylibrary.so File1.o File2.o File3.o -L./include/linux -lc++ -lutil -lm -lcustom -Wl,-rpath='$ORIGIN/include/linux' -L/usr/lib/R/lib -lR

但它给我带来了错误:

libcustom.so.0: cannot open shared object file: No such file or directory

我正在从src 目录执行命令。

我知道编辑LD_LIBRARY_PATH 可以修复它,但是有人可以使用我的库而不需要配置任何东西,所以我尝试使用 c++ 的 -rpath 标志来做到这一点。

知道如何解决它,或者错误的原因吗?

【问题讨论】:

  • 您使用了相对路径-Wl,-rpath=./include/linux,Linux 中的ld 加载程序无法识别该路径。请改用绝对路径。有关使用相对路径的正确方法,请转到 stackoverflow.com/a/4018559/6238076

标签: c++ linker g++


【解决方案1】:

您收到的错误消息似乎来自运行时加载程序ld.so,而不是链接器ld(我知道这些名称令人困惑)。您必须区分在链接时和运行时找到so。您在链接时提供的 -L 标志与在运行时本地化库无关。

您的 rpath=./include/linux 值不正确,因为 dot 未被 ld 识别为相对路径。相对搜索路径应该像这样给出

-Wl,-rpath='$ORIGIN/include/linux'

$ORIGIN 代表您的可执行文件(不是mylibrary.so)所在的文件夹。确保使用 单引号 而不是双引号,因为字符串 $ORIGIN 应该按字面意思传递给链接器并硬编码到可执行文件中。

更多细节去

  1. how to link to shared lib from shared lib with relative path

  2. ld: Using -rpath,$ORIGIN inside a shared library (recursive)

【讨论】:

  • 你是完全正确的,这就是问题所在,因为现在我已经测试了更改 -rpath 指示库的绝对路径并且它可以工作。但是$ORIGIN 对我不起作用,因为我使用的是 Makevars 文件,它会将 -rpath 从-Wl,-rpath="'$$ORIGIN/include/linux'"“翻译”到-Wl,-rpath="'/include/linux'"。我已阅读您建议的帖子中附加的网页,但找不到解决方案。你知道我该如何解决吗?非常感谢
  • 在 Makefile 中,您需要使用 $$ 转义 $ 符号:即 -rpath='$$ORIGIN/include/linux'
  • 另外你不需要双引号路径,只使用单引号。检查 make 命令的回显并确保参数正确传递给 g++
  • 现在我在我的 Makevars 中写了 -rpath='$$ORIGIN/include/linux',它在没有引号的情况下执行 -rpath=$ORIGIN/include/linux。如何添加它们?如果我写-rpath="'$$ORIGIN/include/linux"'(双引号加单引号),它会执行rpath=/include/linux
  • 看来你需要写'-Wl,-rpath=\'$$ORIGIN/include/linux\'' 来转义单引号'stackoverflow.com/a/7860705/6238076
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多