【问题标题】:Porting msvc code to Android/ios将 msvc 代码移植到 Android/ios
【发布时间】:2015-07-15 08:52:55
【问题描述】:

我有一个用 C++ 为 Windows 编写的相当大的项目,其中包含一些特定于 MSVC 的花哨的东西,例如 __declspec(property)、SEH 的使用、额外的模板和宏灵活性、内在函数等。

简而言之,它由各种应用程序和一个共享库 (lib) 组成,这是一个相当大的“算法”代码。它完全用纯 C++(MSVC 的版本,如我所说)编写,不依赖于任何 3rd-party,所​​有代码都是“手工制作”,没有 stdlib、STL、Boost 等。

现在需要将这段代码移植到移动平台,即Android和iOS。

代码应该独立于平台。除了非常基本的东西,比如堆内存分配之外,没有明确的对操作系统的依赖。它确实依赖于一些特定于 Windows 的东西:SEH、TLS,但如果它们不能被替换,这些都是我可以牺牲的。

我正在考虑如何处理它。从特定于 MSVC 的东西中清除整个代码是可能的,但不方便。我更愿意保留它们,而且我绝对不想为不同平台保留多个代码库。

那么,我可以使用哪些选项? 据我了解,有适用于 Android 的 C++ 编译器(NDK 的一部分),但它们可能与标准 C++ 兼容。无论如何,iOS 开发基于 Objective-C,它是普通 C 的超集。

这让我想到了将现有的特定于 MSVC 的 C++ 代码“编译”成纯 C 的想法。MSVC 编译器中有一个选项可以生成“列表”文件,其中包含汇编代码。我想是否可以选择创建包含 C 代码的适当列表。或者,符合 MSVC 的第 3 方 C++ -> C 转换器。

有什么想法吗?

【问题讨论】:

  • SEH 很棒。但它真的损害了可移植性。 GCC 的人拒绝在他们的编译器中将 try/except/finally 作为 C 的扩展。不过,我不记得为什么了。
  • FWIW,即使iOS开发基于Objective-C,你仍然可以在那里使用便携式C++,你可以编写Objective-C++来集成它(基本上可以包含Objective C的文件和 C++ 语法)。

标签: android c++ ios android-ndk porting


【解决方案1】:

那么,我有哪些选择?

编写可移植的 C 或 C++ 代码。

我有在 Android、iOS、Windows Phone、Windows、BSD、OS X 和 Linux 上运行的 C 和 C++ 库。该库是一次编写的,它可以在任何地方运行。

虽然“核心库”是可移植的 C/C++,但上一层却不是。这就是库与平台集成的地方。例如,iOS 测试套件驱动在 Apple 平台上有一个 Cocoa/CocoaTouch UI,在 Windows 和 Windows Mobile 上有一个 MFC 测试套件驱动。 Linux 上的测试套件驱动程序是命令行的,因为我不会在 GTK 或 Qt 上浪费时间。

播种随机数生成器的例程是特定于平台的。我认为它们是核心功能,因此它在核心库中并由特定于平台的#defines 保护。

不要在运行它的每个平台上重新实现您的核心库。这意味着您将需要 4 到 8 倍的开发周期来复制代码和行为。而且总会有一些小的、隐藏的行为错误,你会浪费无数时间来追踪。


我正在考虑如何处理它。从特定于 MSVC 的东西中清除整个代码是可能的,但不方便。

是的,这样做。只需缴纳一次税款,即可在代码的剩余生命周期中享受福利。


这让我想到了将现有的特定于 MSVC 的 C++ 代码“编译”成普通 C 的想法。

不,我不会这样做。从核心库中删除平台特定的东西。使核心库可移植。

【讨论】:

    【解决方案2】:

    MSVC++ 到 C 编译器属于“如果你不得不问,你买不起”的类别。市场太小了。

    更现实的机会是等待微软正在做什么。他们正在认真考虑使用 MSVC 2015 瞄准更多移动平台。

    TLS 可能是最简单的,因为它是标准 C++ (thread_local)。 SEH 应该映射到常规的 C++ 异常处理,这意味着您需要在指针错误发生之前捕获它们。 MSVC 并不完全以 extra 模板灵活性而闻名,它实际上相当不灵活。 x86 内部函数显然已经出现在 ARM 上。

    【讨论】:

    • 谢谢。我肯定会玩 MSVC2015,听起来好得令人难以置信。关于平台相关的事情(SEH、TLS、内在函数)——没关系,我会自己处理,我也不指望自动工具代替我来做这件事。
    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多