C++ 如何编译C++;项目(带有g+;+;)在其他计算机上使用?

C++ 如何编译C++;项目(带有g+;+;)在其他计算机上使用?,c++,opencv,compilation,g++,C++,Opencv,Compilation,G++,这可能是显而易见的,但我想确定在我做任何鲁莽的事情之前该做些什么。我想编译我的C++程序,库和所有,到一个可释放的可执行文件,以便文件可以运行在任何计算机(运行相同的操作系统)。现在,我在MacOSX(10.7.4)上,我需要能够在其他Mac上运行我的可执行文件。问题是我在我的项目中使用OpenCV库,而我只在这台计算机上安装了它。有没有一种方法可以使用g++进行编译,这样如果我在没有安装OpenCV库的计算机上打开这个程序,它仍然可以工作?如中所示,将所有依赖项构建到可执行文件中。或者这是自动

这可能是显而易见的,但我想确定在我做任何鲁莽的事情之前该做些什么。我想编译我的C++程序,库和所有,到一个可释放的可执行文件,以便文件可以运行在任何计算机(运行相同的操作系统)。现在,我在MacOSX(10.7.4)上,我需要能够在其他Mac上运行我的可执行文件。问题是我在我的项目中使用OpenCV库,而我只在这台计算机上安装了它。有没有一种方法可以使用g++进行编译,这样如果我在没有安装OpenCV库的计算机上打开这个程序,它仍然可以工作?如中所示,将所有依赖项构建到可执行文件中。或者这是自动发生的

我对“.o”对象文件也很陌生,所以这些文件与此有关系吗?我更喜欢一种将所有内容都放在一个文件中的方法,但只要它能工作,我就接受一个包


谢谢。

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

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

因此,假设所有共享库都与可执行文件位于同一目录中,您可以使用以下命令进行编译:
g++-rpath./-lopencv-o YourApp YourApp.cpp


我希望这能有所帮助。

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


我建议在mac上使用
Xcode
,因为与自己通过脚本和Makefiles进行链接相比,它简化了捆绑包的构建和框架链接。

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