分布式dylib的链接器设置

时间:2017-01-21 17:21:45

标签: xcode macos linker dylib

我正在努力使用XCode中的正确选项,在我的应用中包含一个dylib。我确实在/usr/local/lib中有一个dylib,我需要为我的应用程序。只要我在Lib Search Paths中设置此路径

language specification

一切正常。但当然我想用我的应用程序分发dylib,这就是为什么我把它添加到复制阶段:

enter image description here

这确实将dylib复制到应用程序中的Frameworks文件夹中。但是在目标系统上运行时,应用程序找不到dylib。它甚至没有在/usr/local/lib中找到它。而是呱呱叫:

  

Dyld错误消息:

     

未加载库:@ rpath / libopencv_imgproc.3.2.dylib

那么,需要设置哪个选项?

修改我整理了一个示例项目enter image description here。它包含3个拉链:一个项目,一个包含要放在/usr/local/include中的标题,另一个包含要放在/usr/local/lib中的dylib。一旦应用程序被编译,它应该能够在任何地方运行。 dylib被复制到应用程序中,但是当在干净的机器上运行时,它仍会在/usr/local/lib中查找dylib。

我尝试了很多方法让它发挥作用,所以我目前完全混淆了。

1 个答案:

答案 0 :(得分:2)

在我之前提到的评论中,错误消息中dylib的名称与您实际使用的名称不同(3.23.2.0)。由于dylib已经构建,您可以通过这种方式将其包含在项目中,这表明现有的rpathid已经存在。

使用otool

$ otool -l libopencv_core.3.2.0.dylib
...
 Load command 3
          cmd LC_ID_DYLIB
      cmdsize 56
         name @rpath/libopencv_core.3.2.dylib (offset 24)
   time stamp 1 Wed Dec 31 17:00:01 1969
      current version 3.2.0
compatibility version 3.2.0
...
 Load command 16
          cmd LC_RPATH
      cmdsize 32
         path /usr/local/lib (offset 12)

这里可以观察到两件事;第一个是确认差异的LC_ID_DYLIB,其次,设置的LC_RPATH(rpath)表示库位置为/usr/local/lib。由于您在应用程序中包含了lib,因此应该对其进行更新。

更新库(应用中包含的库):

$ install_name_tool -id @rpath/libopencv_core.3.2.0.dylib libopencv_core.3.2.0.dylib

更新LC_ID_DYLIB

$ install_name_tool -add_rpath "@executable/../Frameworks" libopencv_core.3.2.0.dylib

添加正确的LC_RPATH

$ install_name_tool -delete_rpath "/usr/local/lib" libopencv_core.3.2.0.dylib

从库中删除rpath /usr/local/lib。要再次验证运行otool -l

...
 Load command 3
          cmd LC_ID_DYLIB
      cmdsize 64
         name @rpath/libopencv_core.3.2.0.dylib (offset 24)
   time stamp 1 Wed Dec 31 17:00:01 1969
      current version 3.2.0
compatibility version 3.2.0
...
 Load command 17
          cmd LC_RPATH
      cmdsize 40
         path @executable/../Frameworks (offset 12)

现在,您应该可以将dylib添加到独立应用中,并且应该正确设置其路径;更新后的dylibhere。更新库后,应用程序将立即打开。

注意事项:在您的问题中,您要导入libopencv_core3.2.0.dylib,但错误状态为libopencv_imgproc.3.2.dylib,但我认为这是另一个dylib遭遇的问题类似的问题,所以这当然可以适用于其他人。您最初在Xcode中设置的rpath是正确的

enter image description here

虽然由于图书馆允许存在多个rpaths并且/usr/local/bin已经存在,但除了错误的名称之外,它首先使用该位置。