我在Xcode中使用OpenCV为OS x创建c++ Unity插件。插件在我的Mac上编译和工作,但在其他机器上,它试图从/usr/local/opt加载动态库(例如,ffmpeg, libtiff, webp)…库未加载:/usr/local/opt/webp/lib/libwebp.6dylib等等)
Brew install解决了这个问题,但有必要"按原样"分发这个插件。
我有两个问题:1)我怎么知道我的项目是否会尝试使用动态库(在其他机器上)?
2)我如何使我的项目从bundle加载它们,而不是从/usr/local/opt?(我尝试链接与-static,但有136个错误"未定义的符号为架构x86_64 - _OSSpinLockLock, _dispatch_get_global_queue和许多其他)。
我不知道如何回答你的第一个问题…如果你不知道你的项目链接到哪些库,谁知道呢?
第二个问题。你需要设置动态库的"安装名"。您可以很容易地找到关于它的详细信息,以及可以用来操作它的install_name_tool
命令行,但本质上它是一个刻在.dylib
内部的变量,它存储了一个路径。该路径告诉链接到它的二进制文件在哪里找到它。当你在你的可部署包中捆绑dylib时,你的安装名通常被设置为@executable_path/path/relative/to/executable/
之类的东西。安装名可以在将库作为编译器标志编译时设置,也可以稍后在dylib文件上使用install_name_tool
设置。
请注意Xcode Build Settings中的"Runpath Search Path"选项与此相关。
我希望这足以给你指明你需要的方向。