2017-02-16 6 views
0

Ich versuche, eine gemeinsam genutzte Bibliothek (A) zu kompilieren, die eine andere gemeinsam genutzte Bibliothek (B) verwendet.kompiliert shared library (alter standar) mit C++ 11 shared library

Die A-Bibliothek muss kompiliert werden, ohne -std=c++11 Option zu g ++ (weil es Tonnen von Code, und einige Dinge wie std::make_pair werden nicht mit dem '11-Standard arbeiten).

Für die Verwendung der B-Bibliothek, die erste nur #include "B.h" in einer ihrer Dateien, und dann mit -I/path/inc -L/path/lib -lB kompilieren.

Die Bibliothek B besteht aus einer Reihe von Funktionen innerhalb der namespace B und enthält einige Klassendefinitionen in einem eigenen Namensraum (B :: internals). Die Beziehung zwischen Funktionen und Klasse ist ein statischer Zeiger im globalen Gültigkeitsbereich, initialisiert mit einem __attribute__((constructor)).

Das Problem ist, dass diese Klasse (B :: Interna :: classB) einige std::mutex private Attribute definiert, und im Anschluss an die gehören der Kette: Liba -> libb ->B::internals ->std::mutex, macht, dass beim Kompilieren Liba ohne -std=c++11 schlägt Standardkompilierung fehl.

Allerdings verwendet libA nie B::internals, daher sollte es kein Problem sein, beide Bibliotheken zu mischen. Wenn die C++ 11-Features private Attribute sind, warum sind sie dann nicht für libA verborgen ?. Gibt es ein Muster für hide B::internals zu libA?

Antwort

1

Es gibt ein C++ - Idiom zum Ausblenden von Implementierungsdetails namens .

Auch die Bibliothek, die mit verschiedenen C++ - Optionen kompiliert wurde, darf keine std Container in seiner Schnittstelle verfügbar machen, da ihr Layout in verschiedenen C++ - Versionen unterschiedlich ist.

+0

Und, was ist mit zwei Überschriften, einer für die Verknüpfung mit libA und der andere für die Zusammenstellung von libB? Gibt es einen Trick wie #ifdef, um das zu machen, oder ist Piplm de facto in der Branche ein Standard? – marolafm

+0

@marolafm Es ist Ihnen überlassen, wie Sie die API bereitstellen (C-Style-Funktionen, Interface + Factory-Funktion, Pimpl), die Implementierungsdetails sollten jedoch nicht in den Headern vorhanden sein. –

Verwandte Themen