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

当运行时。

现在我的观察是 @rpathotool 输出中引用 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

您注意到库的安装名称中缺少 @rpathinstall_name_tool 是允许您更改安装的路径名、添加或删除@rpaths 等的命令。由于修改,install_name_tool 应该在 codesign 之前使用。 Apple documentation 有一个如何设置这种相对结构的例子。