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\'
,以同时转义单引号。