如何避免在c++项目(XCode)中在其他机器上加载动态库



我在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"选项与此相关。

我希望这足以给你指明你需要的方向。

最新更新