Безопасно ли ссылаться на статическую библиотеку, созданную с разными флагами компилятора?

Я использую GoogleTest для тестирования своих проектов на C ++ и, обнаружив, что предварительно скомпилированные библиотеки больше не распространяются в пакете Ubuntu, я обнаружил на веб-сайте проекта следующее:

Если вы компилируете Google Test и ваш тестовый код, используя другой компилятор
флаги, они могут видеть разные определения одного и того же
класс / функция / переменная (например, из-за использования #if в Google Test).
Поэтому, для вашего здравого смысла, мы рекомендуем избегать установки
предварительно скомпилированные библиотеки Google Test. Вместо этого каждый проект должен
скомпилируйте сам Google Test так, чтобы он мог быть уверен, что то же самое
флаги используются как для Google Test, так и для тестов.

Из этого я понимаю, что плохая идея компилировать GoogleTest отдельно от тестируемого проекта. Что я не понимаю, так это то, что это просто GoogleTest или это обычная вещь для связывания библиотек.

Вопрос

Есть ли ситуации, в которых небезопасно ссылаться на предварительно скомпилированные сторонние библиотеки, флаги компилятора или иным образом, и если нет, что такого особенного в GoogleTest?

9

Решение

Есть некоторые флаги компилятора, особенно те, которые работают с выравниванием, которые могут вызвать проблему.

От Флаги GCC i386 и x86-64

-пагубное-дабл
-MnO-Align-дабл

Контролирует, выравнивает ли GCC двойные, длинные двойные и длинные длинные переменные на границе двух слов или на границе одного слова. Выравнивание двойных переменных на границе из двух слов приводит к созданию кода, который на Pentium работает несколько быстрее за счет увеличения объема памяти.

На x86-64 -malign-double включен по умолчанию.

Предупреждение: если вы используете ключ -malign-double, структуры, содержащие вышеуказанные типы, выровнены иначе, чем опубликованные спецификации двоичного интерфейса приложения для 386 и не двоично совместимы со структурами в коде, скомпилированном без этого ключа.

Например, использование этого флага в 32-разрядной системе приведет к выравниванию двойных и длинных длинных для 64-разрядных. Если вы компилируете библиотеку без флага, тогда попытайтесь использовать библиотеку, используя флаг, структуры, которые содержат вышеупомянутые типы, могут иметь различные выравнивания и могут не взаимодействовать.

В других (гораздо более простых) случаях также может быть обеспечен один и тот же набор #defines, чтобы гарантировать использование одинаковых определений функций / структур / классов (и других подобных нарушений ODR). Например, использование ‘—std = c ++ 11’ в gcc, которое включает версии классов стандартной библиотеки на C ++ 11, которые в некоторых случаях отличаются от предыдущих версий.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]