g++找不到.so文件

g++ not find .so files

本文关键字:文件 so 找不到 g++      更新时间:2023-10-16

我正在尝试使用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标志来实现这一点。

知道我该如何修复它吗?或者错误的原因是什么?

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

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

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

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

提供更多详细信息

  1. 如何使用相对路径从共享库链接到共享库

  2. ld:在共享库(递归)中使用-rpath,$ORIGIN