2016-12-18 8 views
0

Я работаю в проекте, состоящем из некоторых команд C++. Каждая команда поставляет библиотеки, и наша команда интегрирует эти библиотеки в приложение с интерфейсом.Как использовать библиотеки llvm

Приложение является кросс-платформенным, поэтому это означает, что другие команды должны предоставлять те же (статические) библиотеки, скомпилированные для разных платформ/архитектуры процессора/конфигурации. Например. у нас есть Visual Studio 2015/2013, 32bit/64bit, linux, Debug/Release и т. д.

Было бы неплохо уменьшить количество этих «проявлений» статической библиотеки, поэтому я искал Clang/LLVM. Идея заключалась бы в компиляции статических библиотек в бит-код LLVM и использовании инструмента llvm-ar для создания статической библиотеки llvm. Когда мы должны создавать двоичные файлы для конкретной платформы, мы будем использовать компилятор llc (LLVM platform compiler) для создания статической библиотеки собственного кода и связывания с компоновщиком платформы.

Вопросы:

  • есть лучший способ сделать то, что я хочу достичь?
  • llc, похоже, не поддерживает компиляцию статической библиотеки, а только отдельные единицы перевода (.bc -> .o). Конечно, я могу извлечь каждый отдельный файл биткода, собрать его в собственный объектный файл и использовать библиотечный инструмент платформы (lib/ar) для создания статической библиотеки, но мне интересно, есть ли более оптимизированное решение.
  • золотой линкер, кажется, делает что-то, что мне нужно, но, кажется, ограничен форматом ELF. Я должен поддерживать Windows/Linux и, возможно, IOS
+0

Насколько я знаю, бит-код LLVM по-прежнему зависит от машины. Лучший способ скомпилировать библиотеку и ссылку - это просто использовать ld/lld с флагами --enable-llvm и -flte - он будет выделять объекты в формате биткода llvm, выполнять на нем всю оптимизацию программы и ссылаться на окончательный двоичный файл. – berkus

+0

Можете ли вы объяснить, почему биткод по-прежнему зависит от машины? Я думаю, что только syscalls должны иметь значение, но я собираюсь использовать C runtime. Я нашел lld проект на веб-странице llvm, он выглядит хорошо! К сожалению, я не финансировал на странице параметры командной строки, можете ли вы объяснить, что делают флаги f, l, t, e? В обычной командной строке gnu ld я не нашел этих переключателей. – user2281723

+0

См. Ниже ответ Антона. – berkus

ответ

1

LLVM IR, созданный с использованием специфического для конкретной платформы языка (C/C++), не будет нейтральным. Подумайте о размерах типоразмеров, выравниваниях, требованиях ABI и т. Д. Не упоминаются чистые исходные коды, такие как препроцессор. Итак, нет, подход, о котором вы подумали, не будет работать вообще.

Для получения дополнительной информации см. LLVM bitcode cross-platform.

+0

Спасибо за ссылку! Что делать, если я избегу всех специальностей в своих алгоритмах. У нас в основном есть алгоритмы хрустания числа, поэтому особых функций, таких как макросы препроцессора, зависящие от платформы, специальные соглашения о вызовах (stdcall и т. Д.) - за исключением cdecl, не ожидаются. Как вы думаете, если мы ограничимся этими правилами, тогда это все еще невозможно/бесполезно? – user2281723

+0

Конечно. Если вы используете, например, std :: vector - подумайте о sizeof (size_t) или sizeof (void *). –