dyld:尽管 rpath 正确,但库未加载
dyld: Library not loaded despite correct rpath
我正在调试一个问题,我试图 link 针对 dylib
,并将程序的 rpath 设置为包含库的目录。
我已将其缩小到以下 MWE:
> ls deps/include/spinnaker/
AVIRecorder.h Camera.h CameraPtr.h Exception.h …bunch of headers
> ls deps/lib/libSpinnaker.dylib*
deps/lib/libSpinnaker.dylib deps/lib/libSpinnaker.dylib.1.24.0.60
> cat test.cpp
#include <cstddef>
#include <Event.h> // for CameraList
#include <CameraList.h> // for CameraList
#include <CameraPtr.h> // for CameraPtr
#include <ImagePtr.h> // for ImagePtr
#include <SystemPtr.h> // for SystemPtr
int main()
{
const auto system_ptr = Spinnaker::System::GetInstance();
}
我用
编译这个
clang++ -std=c++14 -o wat -I deps/include/spinnaker/ -L deps/lib/ -lSpinnaker -Wl,-rpath,./deps/lib test.cpp
因此 libSpinnaker
被引用,如
所示
[…]
Load command 9
cmd LC_UUID
cmdsize 24
uuid B4498482-D872-3270-AC47-102914DDBCBE
Load command 10
cmd LC_BUILD_VERSION
cmdsize 32
platform 1
minos 10.15
sdk 10.15.6
ntools 1
tool 3
version 609.8
Load command 11
cmd LC_SOURCE_VERSION
cmdsize 16
version 0.0
Load command 12
cmd LC_MAIN
cmdsize 24
entryoff 16224
stacksize 0
Load command 13
cmd LC_LOAD_DYLIB
cmdsize 56
name libSpinnaker.dylib.1.24.0.60 (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 0.0.0
compatibility version 0.0.0
Load command 14
cmd LC_LOAD_DYLIB
cmdsize 48
name /usr/lib/libc++.1.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 902.1.0
compatibility version 1.0.0
Load command 15
cmd LC_LOAD_DYLIB
cmdsize 56
name /usr/lib/libSystem.B.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1281.100.1
compatibility version 1.0.0
Load command 16
cmd LC_RPATH
cmdsize 24
path ./deps/lib (offset 12)
Load command 17
cmd LC_FUNCTION_STARTS
cmdsize 16
dataoff 49312
datasize 8
Load command 18
cmd LC_DATA_IN_CODE
cmdsize 16
dataoff 49320
datasize 0
所以包含了 LC_RPATH
,库出现在指定的路径中,但我仍然得到
dyld: Library not loaded: libSpinnaker.dylib.1.24.0.60
Referenced from: <binary-path>
Reason: image not found
Abort trap: 6
当运行时。
现在我的观察是 @rpath
在 otool
输出中引用 libSpinnaker
之前丢失了——对于其他库,当我查看更大的基于 cmake 的库时,它总是存在项目。我希望这条线
name @rpath/libSpinnaker.dylib.1.24.0.60 (offset 24)
而不是我所看到的。
我可以设置 DYLD_LIBRARY_PATH
并且这会起作用,但我想使用 rpath 机制将其烘焙到二进制文件中。
问题:这里缺少@rpath
是否表明有问题?如果是这样,我怎样才能用编译器或 CMake 添加它?如果这不是问题,那是什么?
install_name_tool -id @rpath/libSpinnaker.dylib.1.24.0.60 deps/lib/libSpinnaker.dylib.1.24.0.60
install_name_tool -change libSpinnaker.dylib.1.24.0.60 @rpath/libSpinnaker.dylib.1.24.0.60 wat
您注意到库的安装名称中缺少 @rpath
。 install_name_tool
是允许您更改安装的路径名、添加或删除@rpaths 等的命令。由于修改,install_name_tool
应该在 codesign
之前使用。 Apple documentation 有一个如何设置这种相对结构的例子。
我正在调试一个问题,我试图 link 针对 dylib
,并将程序的 rpath 设置为包含库的目录。
我已将其缩小到以下 MWE:
> ls deps/include/spinnaker/
AVIRecorder.h Camera.h CameraPtr.h Exception.h …bunch of headers
> ls deps/lib/libSpinnaker.dylib*
deps/lib/libSpinnaker.dylib deps/lib/libSpinnaker.dylib.1.24.0.60
> cat test.cpp
#include <cstddef>
#include <Event.h> // for CameraList
#include <CameraList.h> // for CameraList
#include <CameraPtr.h> // for CameraPtr
#include <ImagePtr.h> // for ImagePtr
#include <SystemPtr.h> // for SystemPtr
int main()
{
const auto system_ptr = Spinnaker::System::GetInstance();
}
我用
编译这个clang++ -std=c++14 -o wat -I deps/include/spinnaker/ -L deps/lib/ -lSpinnaker -Wl,-rpath,./deps/lib test.cpp
因此 libSpinnaker
被引用,如
[…]
Load command 9
cmd LC_UUID
cmdsize 24
uuid B4498482-D872-3270-AC47-102914DDBCBE
Load command 10
cmd LC_BUILD_VERSION
cmdsize 32
platform 1
minos 10.15
sdk 10.15.6
ntools 1
tool 3
version 609.8
Load command 11
cmd LC_SOURCE_VERSION
cmdsize 16
version 0.0
Load command 12
cmd LC_MAIN
cmdsize 24
entryoff 16224
stacksize 0
Load command 13
cmd LC_LOAD_DYLIB
cmdsize 56
name libSpinnaker.dylib.1.24.0.60 (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 0.0.0
compatibility version 0.0.0
Load command 14
cmd LC_LOAD_DYLIB
cmdsize 48
name /usr/lib/libc++.1.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 902.1.0
compatibility version 1.0.0
Load command 15
cmd LC_LOAD_DYLIB
cmdsize 56
name /usr/lib/libSystem.B.dylib (offset 24)
time stamp 2 Thu Jan 1 01:00:02 1970
current version 1281.100.1
compatibility version 1.0.0
Load command 16
cmd LC_RPATH
cmdsize 24
path ./deps/lib (offset 12)
Load command 17
cmd LC_FUNCTION_STARTS
cmdsize 16
dataoff 49312
datasize 8
Load command 18
cmd LC_DATA_IN_CODE
cmdsize 16
dataoff 49320
datasize 0
所以包含了 LC_RPATH
,库出现在指定的路径中,但我仍然得到
dyld: Library not loaded: libSpinnaker.dylib.1.24.0.60
Referenced from: <binary-path>
Reason: image not found
Abort trap: 6
当运行时。
现在我的观察是 @rpath
在 otool
输出中引用 libSpinnaker
之前丢失了——对于其他库,当我查看更大的基于 cmake 的库时,它总是存在项目。我希望这条线
name @rpath/libSpinnaker.dylib.1.24.0.60 (offset 24)
而不是我所看到的。
我可以设置 DYLD_LIBRARY_PATH
并且这会起作用,但我想使用 rpath 机制将其烘焙到二进制文件中。
问题:这里缺少@rpath
是否表明有问题?如果是这样,我怎样才能用编译器或 CMake 添加它?如果这不是问题,那是什么?
install_name_tool -id @rpath/libSpinnaker.dylib.1.24.0.60 deps/lib/libSpinnaker.dylib.1.24.0.60
install_name_tool -change libSpinnaker.dylib.1.24.0.60 @rpath/libSpinnaker.dylib.1.24.0.60 wat
您注意到库的安装名称中缺少 @rpath
。 install_name_tool
是允许您更改安装的路径名、添加或删除@rpaths 等的命令。由于修改,install_name_tool
应该在 codesign
之前使用。 Apple documentation 有一个如何设置这种相对结构的例子。