Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为依赖项的依赖项设置rpath?_Linux_Build_Dependencies_Dynamic Linking_Rpath - Fatal编程技术网

Linux 为依赖项的依赖项设置rpath?

Linux 为依赖项的依赖项设置rpath?,linux,build,dependencies,dynamic-linking,rpath,Linux,Build,Dependencies,Dynamic Linking,Rpath,我有一个Linux可执行版本,我通过链接器标志“-Wl,-rpath,./-Wl,-disable new dtags”,设置了rpath,并通过readelf-d验证了rpath是否被设置为/ 这适用于直接依赖项,因为我的可执行文件放在同一目录中时可以找到它们。但这不适用于依赖项的依赖项: 46763: find library=libpulsecommon-13.99.so [0]; searching 46763: search path=/usr/lib/x86_64-l

我有一个Linux可执行版本,我通过链接器标志
“-Wl,-rpath,./-Wl,-disable new dtags”
,设置了rpath,并通过readelf-d验证了rpath是否被设置为/

这适用于直接依赖项,因为我的可执行文件放在同一目录中时可以找到它们。但这不适用于依赖项的依赖项:

46763:     find library=libpulsecommon-13.99.so [0]; searching
46763:     search path=/usr/lib/x86_64-linux-gnu/pulseaudio/tls/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/tls/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/tls/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/tls:/usr/lib/x86_64-linux-gnu/pulseaudio/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio        
(RUNPATH from file ./libpulse.so.0)
在这里,libpulse使用自己的运行路径查找libpulsecommon,该运行路径不包含直接相对路径。我已经改用rpath而不是runpath,因为我看到它提到rpath应该传播到依赖项(而runpath是“每个二进制文件都处理自己”)。不过,情况似乎并非如此


设置Linux可执行文件的正确方法是什么,这样我在同一目录中提供的任何依赖项都会被它及其依赖项找到?

我在构建时没有做任何事情,而是在我的CMake中添加了一个构建后步骤,在该步骤中,我运行patchelf将所有RPath更改为$ORIGIN:

if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    add_custom_command(
            TARGET Client POST_BUILD
                COMMAND find ${OUTPUT_DIR} -type f -maxdepth 1 -exec patchelf --set-rpath '\$\$ORIGIN' {} \\\;
    )
endif()
为了让阅读的人更完整,更常见的方法是有一个安装步骤,将文件放在适当的目录中,并使用已经安装的系统共享libs。在我的情况下,安装步骤不合适,因此我在构建步骤之后添加自定义命令,将依赖项复制到包含可执行文件的目录中,并修改rpath,以便正确加载它们