Компилятор только внешнего интерфейса C ++ (конвертирование C ++ в C) - PullRequest
24 голосов
/ 02 декабря 2009

В настоящее время я управляю некоторым кодом C ++, который выполняется на нескольких платформах из одного дерева исходных текстов (Win32, Linux, терминалы Verifone CC, MBED и даже Nintendo GBA / DS). Однако мне нужно создать приложение, ориентированное на встроенную платформу, для которой нет компилятора 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 ++.

Как вы видите, я поддерживаю большое разнообразие платформ и делюсь большим массивом библиотечного кода (и некоторого кода приложения).

Ответы [ 7 ]

41 голосов
/ 02 декабря 2009

Если вы используете LLVM , llvm-g++ скомпилирует ваш код C ++ в битовый код LLVM, а llc имеет внутренний интерфейс, который преобразует битовый код в C .

Вы можете написать такие команды:

llvm-g++ -emit-llvm -c foo.cpp -o foo.o
llc -march=c <foo.o >foo.c
18 голосов
/ 02 декабря 2009

Comeau C ++ делает это.

5 голосов
/ 03 декабря 2009

Не могу помочь с Z8, но семейство Renesas M16C / M32C в наши дни имеет GCC - см. http://www.kpitgnutools.com/ для предварительно созданного кросс-инструментария, размещенного в Windows. Сам еще не использовал его, но может быть лучше, чем сторонний интерфейс C ++, тем более что ваш код уже нацелен на GCC на других платформах.

2 голосов
/ 02 декабря 2009

Comeau C ++ генерирует C в качестве выходных данных, и они, похоже, очень рады перенести его для работы с различными внутренними компиляторами, хотя я не уверен в точной цене для этого.

Если вы хотите немного больше подхода «по своему усмотрению», вы можете купить лицензию на компилятор EDG C ++. Обычно он используется в качестве внешнего интерфейса (например, Comeau и Intel), но, как я полагаю, он поставляется с генератором кода, который выдает C в качестве вывода. Однако его лицензирование больше ориентировано на поставщиков компиляторов, поэтому лицензия дает вам много прав, но стоит довольно дорого.

1 голос
/ 16 декабря 2009

Из того, что я понял, поддержка c ++ в gcc для r8c / m16c / r32c не совсем развита и достаточно хороша для производственного кода. Но для r8c / m16c / m32c / r32c есть по крайней мере один компилятор, поддерживающий встроенный C ++, и это IAR, я думаю, Tasking также поддерживает встроенный C ++ на m16c.

1 голос
/ 02 декабря 2009

устарел, но, может быть, вы хотите попробовать cfront ?

Я оставлю это для информации - у cfront нет поддержки исключений.

0 голосов
/ 11 апреля 2018

Обратите внимание, что действительное решение для llvm 1.3 Последний выпуск llvm был 6.0.0 , поэтому он вообще не будет работать. (Я публикую это, потому что я пробовал решение этого поста, но оно больше не работает) (Возможно, я сделал что-то плохое)

В моих тестах llc больше не принимает параметр -march = c . И возвращение к 1.3 пока невозможно для меня. Поэтому постарайтесь позаботиться о версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...