我正在构建以下文件:
int main()
{
return 0;
}
带有以下标志:
g++ -o main -Wl,-rpath,'$ORIGIN' main.cpp
但是rpath
标志没有执行任何操作。当我执行以下命令时:
objdump -x main | grep -i rpath
readelf -a main | grep -i rpath
我什么也没得到(RPATH
未定义。
我做错了什么?
我尝试使用以下cmake标志使用不同的二进制文件执行上述操作:
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "\$ORIGIN")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
我已将可执行文件移至另一台计算机,并将需要'dlopen'的动态库放置在同一文件夹中。它已经起作用了(我100%确信这是因为rpath
,因为在应用以上cmake
标志之前,可执行文件没有起作用。
仍然,使用上述两个命令检查rpath
(objdump and readelf
),我仍然看不到任何东西。
如果我在这里没有错过任何内容,则您没有在构建命令中链接任何库。
假设您要链接libusb.so共享库,位于您当前文件夹的libusb子文件夹中,位于main.cpp中。我在这里将不做任何详细说明,例如soname,lib的链接名等,只是为了阐明rpath。
rpath将为库提供运行时链接程序路径,而不是为链接时提供路径,因为即使在编译/链接时也需要存在(可访问)共享库。因此,为使您的应用程序加载器有可能在开始时相对于您的应用程序文件夹查找所需的库,有$ ORIGIN变量,您可以使用readelf来查看它,但前提是您在rpath中链接了带有$ ORIGIN的某些库。这是基于您的问题的示例:
g++ main.cpp -o main -L./libusb -Wl,-rpath,'$ORIGIN/libusb' -lusb
如您所见,您需要提供-L目录用于编译/链接时间搜索,并提供rpath用于运行时链接程序。现在,您可以使用readelf和位置搜索来检查应用程序所需的所有库。