Совместимы ли llvm-gcc и clang с gcc?- в частности, mingw gcc на Windows - PullRequest
27 голосов
/ 10 июля 2010

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

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

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

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

Ответы [ 5 ]

22 голосов
/ 30 июня 2012

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

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

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

2 голосов
/ 04 марта 2013

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

2 голосов
/ 17 июля 2010

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

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

1 голос
/ 11 июля 2010

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

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

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

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

0 голосов
/ 11 июля 2010

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

...