Я пытаюсь скомпилировать общую библиотеку (A), которая использует другую общую библиотеку (B).сбор общей библиотеки (старый стандарт) с использованием общей библиотеки C++ 11
Библиотека 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 :: Внутренности :: ClassB) определяет некоторые std::mutex
личные атрибуты, и после включения Плетеный: Либа -> libB ->B::internals
->std::mutex
, делает, что при составлении Либа без -std=c++11
стандартная компиляция не удалась.
Однако libA никогда не использует B::internals
, поэтому не должно быть проблем с смешиванием обеих библиотек. Кроме того, если функции C++ 11 являются частными атрибутами, почему они не скрыты в libA ?. Есть ли какой-нибудь шаблон для скрытия B::internals
в libA?
А как насчет двух заголовков, один для связи с libA и другого для компиляции libB? Есть ли какой-то трюк, например, #ifdef для этого, или же piplm де-факто в отрасли? – marolafm
@marolafm Это зависит от вас, как выставить API (функции C-стиля, интерфейс + фабричная функция, Pimpl), однако детали реализации не должны присутствовать в заголовках. –