g++;找不到。所以文件 我试图用G++编译器生成一个C++库。我的库有另一个C库作为依赖项,我编译它是为了获得.so文件

g++;找不到。所以文件 我试图用G++编译器生成一个C++库。我的库有另一个C库作为依赖项,我编译它是为了获得.so文件,c++,linker,g++,C++,Linker,G++,我的结构如下: 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,relr

我的结构如下:

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标志来实现这一点


您知道如何修复它,或者错误的原因吗?

您收到的错误消息似乎来自运行时加载程序,而不是链接器(我知道名称很混乱)。您必须区分在链接时和运行时查找so。在链接时给出的-L标志与在运行时本地化库无关

您的
rpath=./include/linux
值不正确,因为
ld
无法将点识别为相对路径。相对搜索路径应如下所示

-Wl,-rpath='$ORIGIN/include/linux'
其中,
$ORIGIN
表示可执行文件(而不是
mylibrary.so
)所在的文件夹。请确保使用单引号而不是双引号,因为字符串
$ORIGIN
应按字面形式传递给链接器,并硬编码到可执行文件中

更多细节如下


  • 您使用相对路径
    -Wl,-rpath=./include/linux
    ,linux中的
    ld
    加载程序无法识别该路径。改用绝对路径。对于使用相对路径的正确方法,goto您是完全正确的,这就是问题所在,因为现在我已经测试了更改指示库的绝对路径的-rpath,并且它可以工作。但是
    $ORIGIN
    对我不起作用,因为我使用的是Makevars文件,它将-rpath从
    -Wl,-rpath=“'$$ORIGIN/include/linux'
    转换为
    -Wl,-rpath=“'/include/linux'
    。我已经阅读了你建议的帖子中的网页,但我找不到解决方案。你知道我怎么修吗?非常感谢您在Makefile中,您需要用
    $$
    转义
    $
    符号:即
    -rpath='$$ORIGIN/include/linux'
    也不需要对路径进行双引号,只使用单引号。检查make命令的回显,确保参数被传递给g++correctlyNow,我已经在Makevars中编写了
    -rpath='$$ORIGIN/include/linux'
    ,并且它执行
    -rpath=$ORIGIN/include/linux
    ,不带引号。如何添加它们?如果我写
    -rpath=“$$ORIGIN/include/linux”
    (双引号加单引号),它执行
    rpath=/include/linux
    ,似乎您需要写
    '-Wl,-rpath=\'$$ORIGIN/include/linux\'
    ,以同时转义单引号