【问题标题】:Deploy and distribute OpenCV applications with Xcode4 on Mac OSX在 Mac OSX 上使用 Xcode4 部署和分发 OpenCV 应用程序
【发布时间】:2011-10-14 22:09:16
【问题描述】:

我正在开发一个 OpenCV 应用程序,我的问题是如何在未安装 OpenCV 的非开发机器上部署和分发该应用程序?

我在带有 OpenCV 2.2 的 Mac OS X Lion 上使用 Xcode4。

谢谢

【问题讨论】:

  • 如果解决方案对您没有帮助,您能否更好地向我们解释您的期望?非常感谢,朱利安

标签: macos deployment xcode4 opencv distribution


【解决方案1】:

这只是部分答案,因为我还没有弄清楚如何使用 OpenCV 库来做到这一点。 (想通了。请参阅下面的更新。)但我已经使用其他库 (SM2DGraphView)。

需要做三件事:

  1. 您需要将程序使用的 OpenCV 库复制到应用程序包中。为此(无论如何,在 Xcode 3 中),将 Copy Files 构建阶段添加到您的目标。将库文件从 Xcode 的文件列表拖到构建阶段。双击 Copy Files 项并将目标设置为 Frameworks。

    请注意,您需要确保包含在 Xcode 项目中的库是库文件,而不是库文件的符号链接。否则只会将符号链接复制到您的应用程序包中。

  2. OpenCV 框架文件的安装路径需要设置为@executable_path/../Framework。如果框架是在 Xcode 中构建的,您可以在项目设置中执行此操作。由于 OpenCV 不是在 Xcode 中构建的,因此您需要在事后使用install_name_tool 命令行程序:install_name_tool -id @executable_path/../Frameworks libopencv_imgproc.2.3.1.dylib。您应该能够在目标的运行脚本构建阶段进行设置。

  3. 可执行文件需要在包的Frameworks 目录中找到库。这是我目前卡住的地方。

更新

我找到了正确的 install_name_tool 命令来让程序查看库(以及查看其他库的库)。 the Qt page for deploying OS X programs 的信息是关键。

我在程序的 Contents/MacOS 目录中的可执行文件上运行了 otool -L 并看到了这个 [非相关行已删除]:

lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
lib/libopencv_highgui.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)

所以我使用这些命令(在 Contents/MacOS 目录中)让程序在正确的位置查找库:

install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib CocoaCVTest 
install_name_tool -change lib/libopencv_imgproc.2.3.dylib @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib CocoaCVTest 
install_name_tool -change lib/libopencv_highgui.2.3.dylib @executable_path/../Frameworks/libopencv_highgui.2.3.1.dylib CocoaCVTest 

然后我切换到 Contents/Frameworks 目录并使用这些命令告诉库它们的安装位置:

install_name_tool -id @executable_path/../Frameworks/libopencv_core.2.3.1.dylib libopencv_core.2.3.1.dylib
install_name_tool -id @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib libopencv_imgproc.2.3.1.dylib
install_name_tool -id @executable_path/../Frameworks/libopencv_highgui.2.3.1.dylib libopencv_highgui.2.3.1.dylib

现在需要告诉 imgproc 库在哪里可以找到核心库,并且需要告诉 highgui 在哪里可以找到核心和 imgproc:

install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib libopencv_imgproc.2.3.1.dylib
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib libopencv_highgui.2.3.1.dylib 
install_name_tool -change lib/libopencv_imgproc.2.3.dylib @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib libopencv_highgui.2.3.1.dylib 

我仍然遇到 highgui 在 /opt/local/bin 中寻找大量库的问题,但我相当有信心解决问题的 OpenCV 部分。现在我只需要将所有这些命令放入 Xcode 中的构建阶段。

【讨论】:

    【解决方案2】:

    我的建议是使用跨平台编译构建器(如改进的自动工具)。一个很常见的是CMake,它不是那么容易处理但不是那么难,不仅是一个常见的,它被OpenCV使用......

    • 1) 在您的开发机器上编写您的应用程序并编写一个 Cmake(不要忘记编写部分以使用 OpenCV Cmake)

    • 2) 将你的 cmake 文件和 opencv 库提供给非开发机器

    • 3) 使用 CMake 脚本在目标平台上构建应用程序,如果您编写正确,它可以构建 opencv(使用自己的 OpenCV Cmake),并构建您的应用程序(使用您编写的应用程序)

    如果您想更进一步,您可以创建一个安装向导或使用 CPack 的软件包,以实现一切自动化。

    Here is the link where you can download it

    朱利安,

    【讨论】:

    • 谢谢,我会试试这个。但我想为非技术人员部署应用程序。我读过应该可以将库文件复制到 app 文件夹中,以便在没有 OpenCV 的机器上分发它。但这对我不起作用...... :(
    • 当然,如果您编写脚本并使用安装向导,我不明白为什么它不适合非技术人员...至少如果他们知道如何点击接下来,应该足够了:p
    • 无需让最终用户单独安装这些库。 OS X 允许将库嵌入到应用程序包中。这是 Mac 上的“正确”方法。它消除了外部依赖,并确保使用的是预期版本的库。
    • @SSteve 这正是我的意思。在最后几天,我没有时间测试其他方法。如何将库嵌入到使用 Xcode4.1 的产品中?
    • @sn3ek 看看我的回答。这是第一步。不幸的是,我还没有弄清楚剩下的所有步骤。在过去的几周里,我一直无法处理它。我认为otool 将有助于解决这个问题。如果您切换到应用程序的 /Contents/MacOS 目录并运行 otool -L _yourappname_,您将看到它使用的库。不知何故,我们需要让它在应用程序的 Frameworks 目录中查找 OpenCV 库,而不是 lib/_xxx_.dylib
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2019-04-06
    • 2019-06-03
    相关资源
    最近更新 更多