我正在努力寻找 XCode 中的正确选项以在我的应用程序中包含 dylib。我在 /usr/local/lib
中有一个 dylib,我的应用程序确实需要它。只要我在Lib Search Paths中设置这个路径
一切正常。但当然,我想将 dylib 与我的应用程序一起分发,这就是我将其添加到复制阶段的原因:
这确实会将 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.2
与 3.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
是正确的
尽管由于库允许存在多个rpath
并且/usr/local/bin
已经存在,所以除了错误的名称之外,它首先使用该位置。
关于xcode - 分布式 dylib 的链接器设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782274/