Подтвердить что ты не робот

Являются ли llvm-gcc и clang бинарными, совместимыми с gcc? - особенно mingw gcc в Windows

Если я создаю статическую библиотеку с llvm-gcc, а затем свяжу ее с программой, скомпилированной с использованием mingw gcc, будет ли результат работать?

То же самое для других комбинаций llvm-gcc, clang и normal gcc. Меня интересует, как это работает в Linux (конечно же, с использованием обычного non-mingw gcc) и других платформ, но акцент делается на Windows.

Я также интересуюсь всеми языками, но с сильным акцентом на C и С++ - очевидно, clang не поддерживает Fortran и т.д., но я считаю, что llvm-gcc делает.

Я предполагаю, что все они используют формат файла ELF, но как насчет условных обозначений вызовов, таблиц виртуальных таблиц и т.д.?

4b9b3361

Ответ 1

Да, для кода C Clang и GCC совместимы (на самом деле оба они используют GNU Toolchain для связывания). Вам просто нужно убедиться, что вы говорите clang для создания скомпилированных объектов, а не для промежуточных объектов биткода. C ABI четко определен, поэтому единственной проблемой является формат хранения.

С++ не переносится между компиляторами в малейшей степени; разные компиляторы используют разные вызовы виртуальных таблиц, конструкторы, разрушения, манипулирование именами, реализации шаблонов и т.д. Как правило, вы должны предполагать, что объекты из одного компилятора С++ не будут работать с другим.

Однако да, на момент написания Clang++ также можно использовать скомпилированные библиотеки GCC/С++; Недавно я создал установку для компиляции программ на С++ с помощью clang, используя стандартную библиотеку времени исполнения g++, и она компилирует + ссылки просто отлично.

Ответ 2

Я не знаю ответа, но слайд 10 в эта презентация, кажется, подразумевает, что файлы .o, созданные llvmgcc содержат байт-код LLVM (.bc) вместо обычного целевого целевого кода, так что возможна оптимизация времени соединения. Тем не менее, LLVM-компоновщик должен уметь связывать код LLVM с кодом, созданным "нормальным" GCC, так как следующий слайд говорит "ссылка в родных .o файлах и библиотеках здесь".

LLVM - это инструмент Linux, иногда я обнаружил, что компиляторы Linux работают не совсем корректно в Windows. Мне было бы любопытно, получишь ли ты его на работу или нет.

Ответ 3

Я использую -m i386pep при связывании clang.o файлов с помощью ld. Преданность llvm к интеграции с gcc открыто просматривается в http://dragonegg.llvm.org/, поэтому его очень интуитивно понятное семейство llvm сильно перекрестно совместимо с gcc tool- цепь.

Ответ 4

Извините - я вернулся в llvm после перерыва и никогда не делал больше, чем учебник. В первый раз, я как бы сгорел после борьбы за то, что LLVM 2.6 построил на MinGW GCC - к счастью, не проблема с LLVM 2.7.

Перейдя в учебное пособие снова, сегодня я заметил в главе 5 учебника не только четкое утверждение о том, что LLVM использует ABI (Application Binary Interface) платформы, но также и то, что компилятор учебника зависит от этого, чтобы разрешить доступ к внешним функции, такие как sin и cos.

Я все еще не знаю, поддерживает ли совместимый ABI С++. Это не проблема соглашений вызовов, таких как определение имени, структура и макет vtable.

Возможность сделать вызовы функций C достаточно для большинства вещей, есть еще несколько проблем, в которых я забочусь о С++.

Ответ 5

Надеюсь, они исправили его, но я избегаю llvm-gcc, потому что я (также) использую llvm как кросс-компилятор, и когда вы используете llvm-gcc -m32 на 64-битной машине, -m32 игнорируется, и вы получаете 64-битные ints, которые должны быть подделаны на вашей 32-битной целевой машине. У Clang нет этой ошибки и gcc. Кроме того, чем больше я использую clang, тем больше мне нравится. Что касается вашего прямого вопроса, не знаю, теоретически эти цели дня имеют хорошо известные или используемые соглашения о вызовах. И вы бы надеялись, что и gcc и llvm соответствуют тому же, но вы никогда не знаете. самый простой способ найти это - написать пару простых функций, скомпилировать и дизассемблировать с помощью обоих наборов инструментов и посмотреть, как они передают операнды в функции.