【发布时间】:2010-09-13 19:44:35
【问题描述】:
对于即将到来的项目,计划将在 Windows 和 Linux 上编译的现有 C++ 代码移植到 MacOS(豹)。该软件是命令行应用程序,但可能会计划一个 GUI 前端。 MacOS 使用 g++ 编译器。通过使用与 Linux 相同的编译器,似乎不会有任何问题,但总会有。
在移植期间有什么需要注意的建议或问题吗?
【问题讨论】:
标签: c++ macos g++ portability
对于即将到来的项目,计划将在 Windows 和 Linux 上编译的现有 C++ 代码移植到 MacOS(豹)。该软件是命令行应用程序,但可能会计划一个 GUI 前端。 MacOS 使用 g++ 编译器。通过使用与 Linux 相同的编译器,似乎不会有任何问题,但总会有。
在移植期间有什么需要注意的建议或问题吗?
【问题讨论】:
标签: c++ macos g++ portability
您的应用是否有 GUI,是哪一个(本机/Qt/Gtk+)?
如果没有,需要注意的问题(与 Linux 相比)主要在动态链接区域。 OS X 使用“-dylib”和“-bundle”,实际上有两种动态库(运行时可加载库和普通库)。 Linux 只有一种(-shared),无论如何都比较松散。
如果您的应用有 GUI,您需要使用 Objective-C 在 Cocoa 中重新编码整个内容。这意味着您也会接触到一种新的语言。有些人(比如 MS)已经使用了 Carbon(C++ API),但它正在被逐步淘汰。我不会向新项目推荐这个。
你最好的运气是使用 Qt 或 Gtk+。几天前(重新)宣布了一个原生 Gtk+ 端口(参见Imendio)。
附言 OS X 当然也运行 X11 二进制文件,但是将其推向您的任何客户可能是一条艰难的道路。他们习惯于使用 Aqua 界面,并因此而富有成效。考虑 X11 只是一个非常短期的解决方案。
p.p.s. OS X 附带的开源插件库的数量是有限的,它们的版本可能会落后。而在 Linux 中,您可以轻松地要求用户安装“libxxx v.y.y”,而在 OS X 中,有多种打包方法(fink、macports),对于商业工具,所需的库应该包含在应用程序中。 OS X 为此提供了“应用程序包”和“框架”(本地副本,使应用程序自给自足)。 Linux 没有这样的概念。这也会对你的构建系统产生很大的影响;也许您想为所有平台尝试类似SCons 的东西?
【讨论】:
您无需将所有内容重新编码为 Objective-C。 C++ 和 Objective-C 有一个奇怪的混蛋,它允许你使用 Objective-C 中的 C++ 代码,因此你可以智能地拆分 C++ 中的模型代码和 Objective-C 中的视图/控制器代码。要使用 Objective-C,只需在源代码文件后缀 .mm 而不是 .m,您甚至可以在同一行混合大多数合法的 C++ 和 Objective-C 语法。
【讨论】:
我们还没有移植到 MacOS,但一直在从 Linux 移植到各种 Unix,主要工作领域是安装和启动系统,所以希望将大部分工作放在那里(假设你现有的已经可在 Linux 和 Windows 之间移植)。
【讨论】:
Macintosh (macosx) 本质上是 FreeBSD 的底层(尽管它已经过调整)。 Linux 和 FreeBSD 在系统编程方面存在一些差异。这些差异主要存在于各种系统调用之间......所以这对您的影响程度将取决于您的应用程序正在做什么以及您在执行期间正在进行什么样的操作系统系统调用。
【讨论】: