Всегда ли статические библиотеки должны быть собраны с теми же параметрами компилятора, что и приложение?
У нас есть многократно используемая библиотека, которая распространяется на несколько продуктов. Большинство продуктов находятся в VxWorks и используют компилятор gcc. Но каждая из них будет работать на разных архитектурах, таких как PPC, MIPS, а в самой PPC существует больше типов, таких как 8531, 8620 и т. Д.
В настоящее время я строю статические библиотеки для каждой из этих плат отдельно и предоставляю. В любом случае можно ли создать общую библиотеку, которая может использоваться во всех этих разных архитектурах?
Кроме того, в настоящее время я стараюсь, чтобы параметры компилятора были такими же, как и у продуктов. Это необходимо? Есть ли в Интернете какая-либо информация, которая классифицирует, какие параметры важно поддерживать одинаковыми для статических библиотек и приложений?
3 ответа
- Нет, другого пути нет - вы должны создавать библиотеки (статические или нет) для каждой платформы. Как вы, наверное, уже знаете, статическая библиотека на самом деле является просто контейнером, в котором хранится множество объектных файлов. Каждый объектный файл содержит двоичный код, специфичный для платформы, для которой была создана библиотека (читай: другой набор инструкций по сборке).
- Да, сохранение параметров компилятора одинаковыми при сборке библиотеки и двоичного файла (программы), использующего ее одинаково, является очень хорошей практикой. Таким образом, вы избегаете потенциально очень неприятных проблем. Некоторые параметры оптимизации несовместимы с двоичным кодом (например, вы можете скомпилировать функцию в библиотеке с оптимизацией, которая заставит ее вернуть (или ожидать) данные по регистру), но ваша основная программа может ожидать, что функция возвращает ее по адресу стек - большая беда.
Это зависит от каждого варианта: параметры платформы и архитектуры, очевидно, должны быть одинаковыми. Другие, такие как оптимизация, отладка, профилирование, могут отличаться.
Представьте, что библиотека может быть предоставлена внешним разработчиком, так что вы на самом деле не знаете, как он ее скомпилировал, только требования к платформе и архитектуре.
Кроме того, в настоящее время я стараюсь, чтобы параметры компилятора были такими же, как и у продуктов. Это необходимо?
"2. Нужно - нет. Фактически, большинство библиотек можно считать автономными и не привязанными к какому-либо конкретному продукту (то есть их можно использовать из многих продуктов). Как таковые, специфичные для продукта флаги просто не входят в библиотеку, или наоборот (специфические флаги реализации библиотеки не должны появляться при компиляции объектов продуктов).