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?
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
@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. –