我正在努力使用XCode中的正确选项,在我的应用中包含一个dylib。我确实在/usr/local/lib
中有一个dylib,我需要为我的应用程序。只要我在Lib Search Paths中设置此路径
这确实将dylib复制到应用程序中的Frameworks
文件夹中。但是在目标系统上运行时,应用程序找不到dylib。它甚至没有在/usr/local/lib
中找到它。而是呱呱叫:
Dyld错误消息:
未加载库:@ rpath / libopencv_imgproc.3.2.dylib
那么,需要设置哪个选项?
修改我整理了一个示例项目。它包含3个拉链:一个项目,一个包含要放在/usr/local/include
中的标题,另一个包含要放在/usr/local/lib
中的dylib。一旦应用程序被编译,它应该能够在任何地方运行。 dylib被复制到应用程序中,但是当在干净的机器上运行时,它仍会在/usr/local/lib
中查找dylib。
我尝试了很多方法让它发挥作用,所以我目前完全混淆了。
答案 0 :(得分:2)
在我之前提到的评论中,错误消息中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
。由于您在应用程序中包含了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
是正确的
虽然由于图书馆允许存在多个rpaths
并且/usr/local/bin
已经存在,但除了错误的名称之外,它首先使用该位置。