【问题标题】:C++ frontend only compiler (convert C++ to C)仅 C++ 前端编译器(将 C++ 转换为 C)
【发布时间】:2010-12-22 10:52:56
【问题描述】:

我目前正在管理一些从单一源代码树(Win32、Linux、Verifone CC 终端、MBED 甚至 Nintendo GBA/DS)在多个平台上运行的 C++ 代码。但是,我需要构建一个针对没有 C++ 编译器(仅限 C)的嵌入式平台的应用程序。我记得许多早期的 C++ 编译器只是基于现有 C 编译器的前端(例如 Glockenspiel 使用 MSC)。现在有没有这样的“前端”C++ 编译器可以生成 C 代码。

                      Tools            Platform
                      -----------      ------------

                ______Visual C++ _____ WIN32
               /
              /_______MBED (ARM)_______MBED (ARM dev board).
             /
            /_________GCC (x86)________Linux
           /
Source____/___________GCC (ARM)________GBA/DS
          \
           \__________SDA______________Verifone Verix CC Terminals
            \
             \________ARM SDT__________Verifine VerixV CC terminals
              \
               \______????_____________Renases M8/16/32.
                \
                 \____????_____________Z8 family.

最后两个平台我有很好的 C 编译器,但没有 C++。

如您所见,我支持多种平台,并且共享大量库代码(和一些应用程序代码)。

【问题讨论】:

  • 有几个好东西要检查,特别是 LLVM 作为从 C++ 生成 C 的一种手段,而且我还没有意识到 GCC 现在支持 Renesas M16/M32(只让 Z8 没有一个 C++ 编译器,老实说,我刚买了一块便宜的开发板来检查它,怀念我的 Z80 出身,虽然它是一个不错的微控制器)。我还想针对旧的 Hypercom 终端(我已经为这些终端编写了很多代码,但我必须有一个单独的源代码树。我知道最新的 Hypercom 是基于 ARM 的,但仍然有数百万个讨厌的 ICE 终端在那里.

标签: c++ c embedded cross-platform


【解决方案1】:

如果您使用LLVMllvm-g++ 会将您的 C++ 代码编译为 LLVM 位码,而llc 有一个将位码转换为 C 的后端。

你可以这样写命令:

llvm-g++ -emit-llvm -c foo.cpp -o foo.o
llc -march=c <foo.o >foo.c

【讨论】:

  • 您的第二个链接已损坏。
  • C 后端是removed in LLVM 3.1:“它有很多问题,以至于无法编译任何重要的程序。”
【解决方案2】:

Comeau C++ 这样做。

【讨论】:

  • 哇,它“令人叹为观止”、“令人惊叹”、“太棒了”,而且他们甚至有一个闪烁的 javascript 链接,该链接漂浮在文本顶部,敦促您购买!
  • @Seth:这个网站有点过火,但它最好的 C++ 编译器,至少在一致性方面。
  • @JudgeDread:至少普通 Windows 版本的 Comeau C++ 绝对便宜——50 美元/份。不过,我不确定他们将其移植到其他目标的费用是多少。
  • @JudgeDread:您应该向 Comeau 询问定价 - 对于更流行的平台(或至少 Windows 和 Linux),价格为 50 美元。如果他已经为您正在寻找的目标提供了一个端口,也许它会是一样的。但对于自定义端口,它可能不会(此页面 comeaucomputing.com/custom.html 表示 $5K - $50K)。但问一下也无妨 - 最坏的情况是,你的处境并不比现在好。
  • @Seth - 该网站非常漂亮。如果您决定购买,订单页面也很有趣。
【解决方案3】:

Z8 无能为力,但如今瑞萨 M16C/M32C 系列拥有 GCC - 请参阅 http://www.kpitgnutools.com/ 了解托管在 Windows 上的预构建跨工具链。我自己还没有使用过它,但可能是比第三方 C++ 前端更好的选择,尤其是当您的代码已经针对其他平台上的 GCC 时。

【讨论】:

  • 谢谢,会检查一下(我目前正在使用来自欧洲电子杂志 Elektor 的 Glyn 开发板用于 R8 和 R32)。开发套件非常方便,因为它们位于小型 DIL 板上,便于在面包板上使用,然后可以插入自制 PCB 上的 SIL/DIL 插座。我正在使用的 MBED 具有相似的外形尺寸。
【解决方案4】:

Comeau C++ 生成 C 作为其输出,他们似乎很乐意将其移植到不同的后端编译器,尽管我不确定它的确切价格。

如果您想要更多“自己动手”的方法,您可以购买 EDG C++ 编译器的许可证。它通常用作前端(例如,由 Comeau 和 Intel 使用),但我相信在交付时,它包含一个代码生成器,可以生成 C 作为其输出。不过,它的许可更多地面向编译器供应商,因此许可赋予您很多权利,但价格相当昂贵。

【讨论】:

    【解决方案5】:

    过时了,但也许你想试试cfront

    我会留下这个信息 - cfront 没有异常支持。

    【讨论】:

      【解决方案6】:

      据我了解,gcc 中对 r8c/m16c/r32c 的 c++ 支持还不够成熟,也不足以用于生产代码。但是对于 r8c/m16c/m32c/r32c,至少有一个编译器支持嵌入式 C++,那就是 IAR,我认为 Tasking 在 m16c 上也支持嵌入式 C++。

      【讨论】:

        【解决方案7】:

        请注意,有效的解决方案适用于 llvm 1.3 llvm 上一个版本是 6.0.0 所以它根本不起作用。 (我发布这个是因为我尝试了这个帖子的解决方案,但它不再起作用了)(也许我做了坏事)

        在我的测试中 llc 不再接受 -march=c 选项。 回到 1.3 对我来说是不可能的。 所以尽量注意版本。

        【讨论】:

          猜你喜欢
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-14
          • 1970-01-01
          • 2017-12-31
          • 1970-01-01
          相关资源
          最近更新 更多