Я работаю в проекте, состоящем из некоторых команд 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
Насколько я знаю, бит-код LLVM по-прежнему зависит от машины. Лучший способ скомпилировать библиотеку и ссылку - это просто использовать ld/lld с флагами --enable-llvm и -flte - он будет выделять объекты в формате биткода llvm, выполнять на нем всю оптимизацию программы и ссылаться на окончательный двоичный файл. – berkus
Можете ли вы объяснить, почему биткод по-прежнему зависит от машины? Я думаю, что только syscalls должны иметь значение, но я собираюсь использовать C runtime. Я нашел lld проект на веб-странице llvm, он выглядит хорошо! К сожалению, я не финансировал на странице параметры командной строки, можете ли вы объяснить, что делают флаги f, l, t, e? В обычной командной строке gnu ld я не нашел этих переключателей. – user2281723
См. Ниже ответ Антона. – berkus