xcode - 分布式 dylib 的链接器设置

标签 xcode macos linker dylib

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

enter image description here

一切正常。但当然,我想将 dylib 与我的应用程序一起分发,这就是我将其添加到复制阶段的原因:

enter image description here

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

Dyld Error Message:

Library not loaded: @rpath/libopencv_imgproc.3.2.dylib

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

编辑我整理了一个示例项目 here 。它包含 3 个 zip:一个项目,一个将 header 放置在 /usr/local/include 中,一个将 dylib 放置在 /usr/local/lib 中>。一旦应用程序被编译,它应该能够在任何地方运行。 dylib 被复制到应用程序中,但在干净的计算机上运行时,它仍然在 /usr/local/lib 中查找 dylib。

我尝试了(太多)很多方法来让它发挥作用,所以我目前完全搞混了。

最佳答案

在我之前的评论中提到,错误消息中的 dylib 名称与此不同(3.23.2.0)您实际使用的那个。由于 dylib 已构建,并且您以这种方式将其包含在项目中,因此表明现有的 rpath 或 id 已存在。

使用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.由于您在应用程序中包含了该库,因此应该对其进行更新。

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

$ 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包含在独立应用程序中,并且它的路径应该设置正确;更新后的 dylib 为 here 。更新库后,应用程序打开没有问题。

注释:在您的问题中,您正在导入libopencv_core3.2.0.dylib,尽管错误指出libopencv_imgproc.3.2.dylib,但我假设另一个 dylib 也遇到了类似的问题,所以这当然可以应用于其他库。您最初在 Xcode 中设置的 rpath 是正确的

enter image description here

尽管由于库允许存在多个rpath并且/usr/local/bin已经存在,所以除了错误的名称之外,它首先使用该位置。

关于xcode - 分布式 dylib 的链接器设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782274/

相关文章:

macos - Docker 中的 NFS : exportfs: <path> does not support NFS export

iphone - AudioQueueStart 报告不支持的格式

windows - "/"和 "\"在不同操作系统中的故事

c++ - 将英特尔的 MKL(BLAS 和 LAPACK)链接到 GCC

linux - 等同于 Linux 上的 DYLD_PRINT_LIBRARIES?

ios - 如何让 Controller 处理 View 中添加的手势? iOS

c++ - Mac OS X。Lua 框架没有这样的文件或目录

C++ 共享库显示内部符号

ios - 在 Xcode Interface Builder 中隐藏 Storyboard 上的 iOS Home Indicator?

objective-c - 自动将 View 放置在下一个逻辑位置(如布局管理器)