Я пытаюсь скомпилировать общую библиотеку (A), которая использует другую общую библиотеку (B).
Библиотека A должна быть скомпилирована без добавления -std=c++11
вариант g ++ (потому что есть тонны кода, и некоторые вещи, как std::make_pair
не будет работать со стандартом 11 года).
Для использования библиотеки B, первый просто #include "B.h"
в одном из его файлов, а затем скомпилировать с -I/path/inc -L/path/lib -lB
,
Библиотека B состоит из набора функций внутри namespace B
и включает в себя некоторые определения классов в своем собственном пространстве имен (B :: internals). Отношение между функциями и классом является статическим указателем в глобальной области видимости, инициализированным __attribute__((constructor))
,
Проблема в том, что этот класс (B :: internals :: classB) определяет некоторые std::mutex
частные атрибуты и, следуя цепочке включения:
libA -> libB -> B::internals
-> std::mutex
,
делает это при компиляции libA без -std=c++11
стандартная компиляция не удалась.
Однако libA никогда не использует B::internals
, поэтому не должно быть проблем смешивания обеих библиотек. Кроме того, если функции c ++ 11 являются частными атрибутами, почему они не скрыты в libA ?. Есть ли какой-то шаблон для скрытия B::internals
в libA?
Существует язык C ++ для сокрытия деталей реализации, называемый Pimpl
.
Кроме того, библиотека, скомпилированная с различными параметрами C ++, не должна предоставлять std
контейнеры в его интерфейсе, потому что их расположение отличается в разных версиях C ++.
Других решений пока нет …