2012-12-31 9 views
7

EDIT: Ich weiß über Wächter einschließen, aber Include-Dateien sind nicht das Problem hier. Ich spreche über tatsächlich kompilierten und bereits verbundenen Code, der in die statische Bibliothek gebacken wird.Wie vermeiden Sie den gleichen Code bei der Verwendung von C++ - Bibliotheken?

Ich erstelle eine universelle Dienstprogrammbibliothek für mich selbst in C++.

Eine der Funktionen, die ich erstelle, printFile, erfordert string, cout und andere solche Mitglieder der Standardbibliothek.

Ich mache mir Sorgen, dass, wenn die Bibliothek kompiliert wird, und dann zu einem anderen Projekt verknüpft, die auch string und cout verwendet, um den Code für string und cout wird dupliziert werden: Es wird sowohl das Programm in der Bibliothek binär vorgebunden werden soll, Verbunden sein, und es wird wieder mit dem Projekt verknüpft, das sie selbst verwendet.

ist die Bibliothek wie folgt strukturiert:

  1. Es gibt eine libname.hpp Datei der Programmierer, der die Bibliothek verwendet, um #include in seinen Projekten soll.
  2. Für jede Funktion fname in libname.hpp deklariert, gibt es eine Datei fname.cpp, die es implementiert.
  3. Alle fname.cpp Dateien auch #include "libname.hpp".
  4. Die Bibliothek selbst kompiliert in libname.a, die zu /usr/lib/ kopiert wird.

Wird dies sogar passieren?
Wenn ja, ist das überhaupt ein Problem?
Wenn ja, wie kann ich das vermeiden?

Antwort

3

Ich mache mir Sorgen, dass, wenn die Bibliothek kompiliert wird, und dann zu einem anderen Projekt verknüpft, die auch String und cout verwendet, wird der Code für Streich- und cout

Sorgen Sie sich nicht dupliziert werden: kein modernes Kompilierungssystem wird das tun. Der Code für Vorlagenfunktionen wird in Objektdateien ausgegeben, der Linker verwirft jedoch doppelte Einträge.

0

Ja, der Code für Standardbibliotheksdinge wird dupliziert. Es kann ein Problem sein, wenn Sie beispielsweise einen std :: string zurückgeben oder einen als Parameter in einer Ihrer Methoden verwenden. Es kann in Ihrer Standardbibliotheksimplementierung ein anderes Layout als das des Benutzers aufweisen.

+1

OK, ich verstehe. Wie man dies jedoch vermeidet, ist ein großer Teil meiner Frage. – corazza

+0

Ich merke jetzt, dass ich zwei verschiedene Probleme vermische: Code-Duplizierung und Standard-Bibliotheksklassen-Layouts. Die zweite ist kein Problem, wenn Sie Ihr Programm mit dem gleichen Compiler kompilieren, mit dem Sie die Bibliothek kompiliert haben, was Ihrem Fall entspricht. Was die erste betrifft, kann dies zu einem größeren Code führen, ist aber ansonsten kein Problem. – user1610015

3

Die Bibliotheksdefinitionen der C++ - Standardbibliothek werden nicht in Ihrer eigenen statischen Bibliothek angezeigt, sofern Sie sie nicht explizit dort einschließen (d. H. Sie extrahieren Objektdateien aus der C++ - Standardbibliothek und fügen sie in Ihre Bibliothek ein). Statische Bibliotheken sind überhaupt nicht verknüpft und haben nur undefinierte Verweise auf andere Bibliotheken. Eine statische Bibliothek ist lediglich eine Sammlung von Objektdateien, die die von der Bibliothek bereitgestellten Symbole definieren. Die Definitionen, die aus den Headern stammen, z. B. Inline-Funktionen und Template-Instanziierungen, werden so definiert, dass mehrere Definitionen in mehreren Übersetzungseinheiten nicht miteinander kollidieren. Wo der Code nicht tatsächlich inline ist, wird er "schwache" Symbole definieren, was dazu führt, dass Duplikate ignoriert oder zur Verbindungszeit entfernt werden.

Die einzige wirkliche Sorge ist, dass die in eine ausführbare Notwendigkeit verknüpften Bibliotheken Definitionen kompatibel Bibliothek zu verwenden. Bei erheblichem Code in den Headerdateien gibt es relativ häufige Änderungen an den C++ - Headerdateien, einschließlich Standard-C++ - Bibliothekskopfzeilen (relativ zu den C-Bibliothekskopfzeilen, die viel weniger Code enthalten). Diese

0

ist selten ein Problem in der Praxis.

Für static Funktionen und Inline-Vorlagenfunktionen, die in Header-Dateien definiert sind, gibt es keine Bedenken: Jede Kompilierungseinheit erhält eine eigene Kopie (z. B. in der .a-Bibliothek können bereits viele anonyme Kopien vorhanden sein). Dies ist in Ordnung, da diese Definitionen nicht exportiert werden, sodass der Linker sich keine Gedanken darüber machen muss.

Für Funktionen, die mit nicht-statischer Bindung deklariert sind, ob Sie ein Problem haben hängt davon ab, wie Sie verbinden die .a Bibliothek.

Wenn Sie die Bibliothek erstellen, werden Sie normalerweise nicht Link in der C++ - Standardbibliothek. Die erstellte Bibliothek enthält nicht definierte Verweise auf die C++ - Standardbibliothek. Diese müssen vor dem Erstellen der endgültigen ausführbaren Binärdatei aufgelöst werden. Dies wird normalerweise automatisch ausgeführt, wenn diese endgültige Binärdatei auf die Standard-Art (abhängig vom Compiler) verknüpft wird.

Es gibt Zeiten, wenn die Leute Link tun in der Standard-C++ Bibliothek in eine statische Bibliothek. Wenn Sie eine Verknüpfung mit mehreren statischen Bibliotheken herstellen, die jeweils eine andere Bibliothek einbetten (wie die C++ - Standardbibliothek), erwarten Sie Probleme, wenn diese eingebetteten Bibliotheken Unterschiede aufweisen. Glücklicherweise ist dies ein seltenes Problem, zumindest mit der gcc Toolchain. Es ist ein more frequent problem mit Microsoft-Tools.

In einigen Fällen ist eine Abhilfe eine oder mehr widersprüchlichen statische Bibliotheken in eine dynamische Bibliothek zu machen. Auf diese Weise kann jede dieser dynamischen Bibliotheken ihre eigene Kopie der problematischen Bibliothek statisch verknüpfen. Solange die dynamische Bibliothek die Symbole nicht aus der problematischen Bibliothek exportiert und keine Inkompatibilitäten des Speicherlayouts vorliegen, gibt es im Allgemeinen keine Probleme.

Verwandte Themen