it-swarm.com.de

Wie benutze ich Bibliotheken?

Aus irgendeinem Grund kann ich externe Bibliotheken in keiner Sprache verwenden. Ich suche nach Anweisungen/Erklärungen zur Verwendung externer Bibliotheken sowie deren Funktionsweise. Wenn ich online recherchiere, bekomme ich Fragmente, die scheinbar nie für die Bibliothek gelten, die ich herunterlade und versuche. Ich arbeite sowohl auf einem Mac als auch auf einem PC, und C++ - Beispiele sind in Ordnung. Ich verwende Eclipse IDE mit dem C++ - Plug-In. Wenn es Anweisungen gibt, die für alle Bibliotheken gelten, wäre das großartig. 

54
sinθ

Angenommen, Sie haben eine wie folgt definierte Klasse Unuseful:

Datei Unuseful.h:

class Unuseful {
public:
    void printUnusefulStatement();
};

Datei Unuseful.cpp:

#include "unuseful.h"
#include <iostream>

void Unuseful::printUnusefulStatement()
{
    std::cout << "Hello world!" << std::endl;
}

Jetzt haben Sie eine andere Klasse, die ungewöhnliche Anweisungen drucken muss:

Unuseful u;
u.printUnusefulStatement();

Das bedeutet, dass Sie eine externe Bibliothek verwenden möchten, die die spezifische Implementierung (printUnusefulStatement) enthält, die Sie in Ihren Code aufnehmen möchten.

Sie können diese Bibliothek auf zwei Arten verwenden:

  1. Indem Sie den Quellcode dem Compiler zur Verfügung stellen
  2. Geben Sie dem Linker eine binäre Datei (die zuvor für Ihre Architektur kompiliert wurde)

Fall 1: Verwenden einer Bibliothek zur Kompilierzeit

Dies ist der einfachste Fall ..__ Sie haben den Quellcode der Bibliothek, die Sie verwenden müssen, und Sie müssen ihn einfach zusammen mit Ihrem vorhandenen Code kompilieren (sagen Sie main.cpp-Datei) . Normalerweise sind Sie Autor und Benutzer von die Bibliothek (eine Klasse, die eine Aufgabe erfüllt, die Sie benötigen).

Kompilieren mit diesem Befehl:

g++ main.cpp unuseful.cpp

können Sie die benötigte Implementierung in Ihrer main.cpp-Datei verwenden.

Fall 2: Verlinken einer Bibliothek

Häufig als Fall 1 verfügen Sie nicht über den Quellcode der Bibliothek, die Sie verwenden möchten. Sie haben nur die Header-Datei (Unuseful.h, um mit dem Beispiel fortzufahren) und eine static - oder shared -Bibliothek (wahrscheinlich [*] libunuseful.a- bzw. libunuseful.so-Dateien).

Die statische Bibliothek ist ein Archiv von Objektdateien (*.o), die in Ihren endgültigen ausführbaren Dateien verlinkt sind. Stattdessen werden die gemeinsam genutzten Bibliotheken dynamisch geladen - zur Laufzeit (siehe diese Seite für ein besseres Verständnis des Unterschieds).

Statische Bibliotheken werden durch einfaches Archivieren der *.o-Dateien mit dem Programm ar erstellt:

# Create the object files (only one here)
g++ -c unuseful.cpp
# Create the archive (insert the lib prefix)
ar rcs libunuseful.a unuseful.o

Gemeinsam genutzte Bibliotheken werden mit der Option g++-shared erstellt:

# Create the object file with Position Independent Code[**]
g++ -fPIC -c unuseful.cpp
# Crate the shared library (insert the lib prefix)
g++ -shared -o libunuseful.so unuseful.o

Nehmen wir an, Sie haben jetzt die Unuseful.h-Datei und die gemeinsam genutzte Bibliothek (libunuseful.so-Datei) und eine main.cpp-Datei, die ein Unuseful-Objekt instantiiert und die printUnusefulStatement-Methode aufruft.

Wenn Sie versuchen, diese Datei zu kompilieren (g++ main.cpp), beschwert sich der Linker, da er das printUnusefulStatement-Symbol nicht finden kann.

Es ist Zeit, die Bibliothek zu benutzen:

g++ main.cpp -L. -lunuseful

Die Option -L teilt dem Linker mit, wo nach Bibliotheksdateien gesucht werden soll, und das Flag -l teilt dem Linker den Namen der zu verwendenden Bibliotheken mit (ohne das Präfix lib).

Jetzt wird die ausführbare Datei (a.out, da ich keinen anderen Namen angegeben habe) erstellt, und Sie haben eine Bibliothek verwendet, um eine von Ihnen benötigte Funktionalität (printUnusefulStatement) zu implementieren.

Da die gemeinsam genutzte Bibliothek zur Laufzeit geladen wird, schlägt die Ausführung der ausführbaren Datei a.out möglicherweise fehl, da das System die Bibliothek nicht finden kann .. Normalerweise kann dies gelöst werden, indem eine Umgebungsvariable gesetzt wird, die die zu verwendenden Pfade angibt Suche nach dynamischen Bibliotheken:

# Set the LD_LIBRARY_PATH [*]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

Fertig, jetzt wurde Ihre ausführbare Datei kompiliert und es kann die benötigte Bibliothek ausführen und laden.

Fazit

Dies ist ein schneller Überblick über Bibliotheken, von dem ich hoffe, dass Sie verstehen können, wie sie verwendet und anderen zur Verfügung gestellt werden.

Es gibt viele Aspekte, die bei Interesse genauer untersucht werden sollten: g++-Optionen beim Erstellen von gemeinsam genutzten Bibliotheken, ar-Optionen, Umgebungsvariablen, das Format der gemeinsam genutzten Bibliotheken usw.

[*]: In einer Unix-Umgebung

[**]: Wenn er für die Zielmaschine unterstützt wird, geben Sie einen positionsunabhängigen Code aus, der für die dynamische Verknüpfung geeignet ist und keine Begrenzung der Größe der globalen Offset-Tabelle zulässt. Diese Option unterscheidet sich beim m68k, PowerPC und SPARC. Positionsunabhängiger Code erfordert eine spezielle Unterstützung und funktioniert daher nur auf bestimmten Maschinen. [Von der g ++ man-Seite]

145
Vincenzo Pii

Hier fangen Sie an http://en.wikipedia.org/wiki/Library_(computing)

Eine "Bibliothek" ist im Wesentlichen eine Sammlung von kompilierten Funktionen und Klassendeklarationen.

Auf einem Mac gibt es auch "Frameworks", die Pascals Einheiten etwas ähneln und sowohl die Deklarationen als auch den kompilierten Code enthalten.

In verwalteten Sprachen wie Java oder C # gibt es Pakete und Assemblys. Beide sind eng mit Bibliotheken verbunden.

Um Bibliotheken in C oder C++ verwenden zu können, benötigen Sie eine .lib-Datei (oder .a-Datei für die meisten POSIX- oder GCC-Toolchain-basierten Compiler) und die Prototypen der Funktionen, die in die .lib-Datei kompiliert werden. Abhängig von Ihrer Entwicklungsumgebung (für Eclipse verwenden Sie höchstwahrscheinlich den GCC-Compiler und die Toolkette GNU mit Linker LD), geben Sie einfach die Bibliotheksdateien (.lib oder .a) als Eingabe an Linker. Meistens wird die Bibliothek von Header-Dateien begleitet, die Definitionen von Funktionsprototypen enthalten.

Selbst wenn Sie nicht über den Linker Bescheid wussten, was seltsam genug ist, werden die Bibliotheken immer noch implizit in Ihrem Programm verwendet - std :: cout befindet sich in libstdc ++ oder der C-Laufzeitbibliothek.

Als Beispiel für eine umfangreiche Bibliothek und eine nützliche Gruppe von C++ - Klassen sollten Sie sich Boost ansehen.

Um GUI unter Windows zu schreiben, können Sie die in MSDN beschriebene WinAPI verwenden.

Um eine GUI auf einem Mac zu schreiben, können Sie die Carbon-API verwenden, die WinAPI etwas ähnelt, aber jetzt veraltet ist. Die einzige Möglichkeit, eine "legitime" GUI für MacOS zu schreiben, ist die Verwendung von Cocoa und Objective-C.

Um plattformübergreifende GUI zu schreiben, können Sie viele Bibliotheken verwenden: Qt, wxWidgets und GTK.

Nicht zuletzt. C++ ist nicht die beste Sprache für GUI.

6
Viktor Latypov

Die beste Möglichkeit, externe C++ - Bibliotheken zu verwenden, ist die Verwendung eines C++ - Paketmanagers.

Einige von ihnen beinhalten die Verwendung von CMake, Sie finden ein gut geschriebenes Tutorial hier .

0
adem