Aus irgendeinem Grund kann ich keine externen Bibliotheken in einer Sprache verwenden. Ich suche nach Anweisungen / Erklärungen zur Verwendung externer Bibliotheken und deren Funktionsweise. Wenn ich online suche, erhalte ich Fragmente, die scheinbar nie auf die Bibliothek zutreffen, die ich herunterlade und versuche und verwende. Ich arbeite sowohl auf einem Mac als auch auf einem PC, und C ++ - Beispiele sind in Ordnung. Ich verwende die Eclipse-IDE mit dem C ++ - Plug-In. Wenn es Anweisungen gibt, die für alle Bibliotheken gelten, wäre das großartig.
75
std::cout << "Hello World";
Sie eine Bibliothek. Könnten Sie genauer sein?Antworten:
Angenommen, Sie haben eine Klasse
Unuseful
wie folgt definiert: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 nicht nützliche Anweisungen drucken muss:
Dies 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:
Fall 1: Verwenden einer Bibliothek zur Kompilierungszeit
Dies ist der einfachste Fall. Sie haben den Quellcode der Bibliothek, die Sie verwenden müssen, und müssen ihn einfach zusammen mit Ihrem vorhandenen Code (z. B.
main.cpp
Datei) kompilieren . In der Regel sind Sie der Autor und Benutzer der Bibliothek (eine Klasse, die eine von Ihnen benötigte Aufgabe erfüllt).Kompilieren mit diesem Befehl:
ermöglicht es Ihnen, die Implementierung zu verwenden, die Sie in Ihrer
main.cpp
Datei benötigen .Fall 2: Verknüpfen einer Bibliothek
In den meisten Fällen als in 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 statische oder gemeinsam genutzte 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 verknüpft sind. Die gemeinsam genutzten Bibliotheken werden stattdessen dynamisch geladen - zur Laufzeit (auf dieser Seite finden Sie ein besseres Verständnis des Unterschieds).Statische Bibliotheken werden durch einfaches Archivieren der
*.o
Dateien mit demar
Programm 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
Freigegebene Bibliotheken werden mit der
g++
-shared
Option 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 einemain.cpp
Datei, die einUnuseful
Objekt instanziiert und dieprintUnusefulStatement
Methode aufruft .Wenn Sie versuchen, diese Datei (
g++ main.cpp
) zu kompilieren, beschwert sich der Linker, weil er dasprintUnusefulStatement
Symbol nicht finden kann .Es ist Zeit, die Bibliothek zu benutzen:
Die
-L
Option teilt dem Linker mit, wo nach Bibliotheksdateien gesucht werden soll, und das-l
Flag teilt dem Linker den Namen der zu verwendenden Bibliotheken mit (ohnelib
Präfix).Jetzt wird die ausführbare Datei erstellt (
a.out
da ich keinen anderen Namen angegeben habe), und Sie haben eine Bibliothek verwendet, um eine von Ihnen benötigte Funktionalität zu implementieren (printUnusefulStatement
).Da die gemeinsam genutzte Bibliothek zur Laufzeit geladen wird, schlägt die Ausführung der
a.out
ausführbaren Datei möglicherweise fehl, da das System die Bibliothek nicht finden kann. In der Regel kann dies gelöst werden, indem eine Umgebungsvariable festgelegt wird, die angibt, welche Pfade für die Suche nach dynamischen Bibliotheken verwendet werden sollen:# Set the LD_LIBRARY_PATH [*] export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
Fertig, jetzt wurde Ihre ausführbare Datei kompiliert und sie kann die benötigte Bibliothek ausführen und laden.
Fazit
Dies ist ein schneller Überblick über Bibliotheken, von denen ich hoffe, dass sie Ihnen helfen können, zu verstehen, wie sie verwendet und anderen zur Verfügung gestellt werden.
Es gibt viele, viele Aspekte, die bei Interesse genauer untersucht werden sollten:
g++
Optionen beim Erstellen von gemeinsam genutzten Bibliotheken,ar
Optionen, Umgebungsvariablen, das Format für gemeinsam genutzte Bibliotheken usw.[*]: In einer Unix-Umgebung
[**]: Wenn dies für den Zielcomputer unterstützt wird, geben Sie positionsunabhängigen Code aus, der für die dynamische Verknüpfung geeignet ist und eine Begrenzung der Größe der globalen Versatztabelle vermeidet. Diese Option macht einen Unterschied bei m68k, PowerPC und SPARC. Positionsunabhängiger Code erfordert spezielle Unterstützung und funktioniert daher nur auf bestimmten Computern. [Von der g ++ Manpage]
quelle
Hier starten Sie http://en.wikipedia.org/wiki/Library_(computing)
Grundsätzlich ist eine 'Bibliothek' eine Sammlung kompilierter Funktionen und Klassendeklarationen.
Auf einem Mac gibt es auch "Frameworks", die Pascals Einheiten etwas ähnlich sind 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 eine .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 GNU-Toolchain mit LD-Linker) geben Sie einfach die Bibliotheksdateien (.lib oder .a) als Eingabe für den Linker an. Meistens wird die Bibliothek von Header-Dateien begleitet, die die Definitionen von Funktionsprototypen enthalten.
Auch wenn Sie nicht über den Linker Bescheid wussten, was seltsam genug ist, werden die Bibliotheken implizit in Ihrem Programm verwendet - std :: cout befindet sich in der libstdc ++ - oder der C-Laufzeitbibliothek.
Als Beispiel für eine riesige Bibliothek und eine nützliche Reihe von C ++ - Klassen sollten Sie sich Boost ansehen.
Um eine 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 eine plattformübergreifende Benutzeroberfläche zu schreiben, können Sie viele Bibliotheken verwenden: Qt, wxWidgets, GTK unter ihnen.
Nicht zuletzt. C ++ ist nicht die beste Sprache für die GUI.
quelle
Der beste Weg, externe C ++ - Bibliotheken zu verwenden, besteht darin, einen C ++ - Paketmanager zu verwenden.
Einige von ihnen beinhalten die Verwendung von CMake. Ein gut geschriebenes Tutorial dazu finden Sie hier .
.
quelle