【问题标题】:How can I compile a C++ project (with g++) to use on other computers?如何编译 C++ 项目(使用 g++)以在其他计算机上使用?
【发布时间】:2012-07-11 20:43:36
【问题描述】:

这可能很明显,但我想在我做任何轻率的事情之前确定要做什么。我想将我的 C++ 程序、库和所有程序编译为发布可执行文件,以便该文件可以在任何计算机上运行(运行相同的操作系统)。现在,我在 Mac OS X (10.7.4) 上,我需要能够在其他 Mac 上运行我的可执行文件。问题是我在我的项目中使用 OpenCV 库,而我只在这台计算机上安装了它。有没有办法用 g++ 编译,如果我在没有安装 OpenCV 库的计算机上打开这个程序,它仍然可以工作?如,将所有依赖项构建到可执行文件中。还是这会自动发生?

我对“.o”目标文件也很陌生,那么这些与它有什么关系吗?我更喜欢将它们全部放入一个文件的方法,但只要它可以工作,我就会接受一个包。

谢谢。

【问题讨论】:

  • 尝试用g++ -static链接;这应该将 OpenCV 的静态版本(和其他依赖项)链接到您的二进制文件中。不过,生成的二进制文件可能非常大。
  • @larsmans 如果静态链接受 GPL 或类似许可的约束,则静态链接也会因许可而变得复杂。
  • 您应该能够将 OpenCV 动态库添加到您的应用程序包中(OS X 应用程序不是文件,而是具有特殊结构的文件夹)。我不知道该怎么做,但 Apple 的文档通常知道。

标签: c++ opencv compilation g++


【解决方案1】:

要扩展 molbdnilo 的答案,您需要创建一个应用程序包(请参阅 Apple Bundle Programming guide)。您需要将控制台应用程序移至MyApp.app/Contents/MacOS/MyApp。还有一个 Frameworks 目录,您需要在其中添加 OpenCV 库作为框架。有关 OpenCV 框架的一些信息,请参阅OpenCV Wiki。框架(最简单的)几乎是一个包装在特定目录结构中的动态库。

我建议考虑在 mac 上使用 Xcode,因为与通过脚本和 Makefile 自己做相比,它简化了包的构建和链接到框架。

【讨论】:

    【解决方案2】:

    有两种方法可以做到这一点。如果您不打算与您要链接的任何库遇到许可问题,您可以静态链接。这很容易通过使用g++ -o myApp -static -lopencv myapp.cpp 处理,但是,这也取决于您想要链接到的库的现有静态库。如今,大多数都使用共享库分发静态库。

    另一种方法是分发共享库并告诉您的应用程序使用-rpath 强制它在某个位置查找共享库。注意:我是在告诉你 Linux 的方法,它可能在 Mac 上可以工作,但我无法测试。

    假设你所有的共享库都和你的可执行文件在同一个目录下,你可以编译:g++ -rpath ./ -lopencv -o YourApp yourApp.cpp

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      相关资源
      最近更新 更多