Verwendung von Bibliotheken

75

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.

sinθ
quelle
1
Wenn Sie dies tun, verwenden std::cout << "Hello World";Sie eine Bibliothek. Könnten Sie genauer sein?
Jesse Good
Ihre letzte Frage betraf #include <iostream>, also haben Sie sie bis zu einem gewissen Grad verwendet, nein? Ihre Frage ist ziemlich offen, probieren Sie etwas Bestimmtes aus und stellen Sie dann eine Frage dazu.
Benj
2
Ich denke, meine Frage zeigt, wie wenig ich über Programmierung weiß. Ich meine Bibliotheken, die nicht in die Sprache integriert sind (wenn das Sinn macht).
sinθ
6
Bibliotheken, die nicht Teil einer Sprache sind, werden normalerweise als "Bibliotheken von Drittanbietern" bezeichnet
Rob Kielty,
Bitte fordern Sie kein Tutorial an. Sie sollten eine bestimmte Frage für ein bestimmtes Programmierproblem stellen. Da Stack Overflow den Close-Grund vor Ihnen verbirgt: "Fragen, die uns bitten, ein Buch, ein Tool, eine Softwarebibliothek, ein Tutorial oder eine andere externe Ressource zu empfehlen oder zu finden, sind für Stack Overflow nicht zum Thema, da sie dazu neigen, meinungsgebundene Antworten und Spam anzulocken. Beschreiben Sie stattdessen das Problem und was bisher getan wurde, um es zu lösen. "
JWW

Antworten:

176

Angenommen, Sie haben eine Klasse Unusefulwie 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:

Unuseful u;
u.printUnusefulStatement();

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:

  1. Durch Bereitstellung des Quellcodes für den Compiler
  2. Durch Bereitstellen einer Binärdatei (die zuvor für Ihre Architektur kompiliert wurde) für den Linker

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.cppDatei) 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:

g++ main.cpp unuseful.cpp

ermöglicht es Ihnen, die Implementierung zu verwenden, die Sie in Ihrer main.cppDatei 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.hum mit dem Beispiel fortzufahren) und eine statische oder gemeinsam genutzte Bibliothek (wahrscheinlich [*] libunuseful.abzw. libunuseful.soDateien).

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 *.oDateien mit dem arProgramm 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++ -sharedOption 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.hDatei und die gemeinsam genutzte Bibliothek ( libunuseful.soDatei) und eine main.cppDatei, die ein UnusefulObjekt instanziiert und die printUnusefulStatementMethode aufruft .

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

Es ist Zeit, die Bibliothek zu benutzen:

g++ main.cpp -L. -lunuseful

Die -LOption teilt dem Linker mit, wo nach Bibliotheksdateien gesucht werden soll, und das -lFlag teilt dem Linker den Namen der zu verwendenden Bibliotheken mit (ohne libPräfix).

Jetzt wird die ausführbare Datei erstellt ( a.outda 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.outausfü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, arOptionen, 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]

Vincenzo Pii
quelle
6
habe das gerade gefunden ... vielen Dank für diese klare Erklärung. Ich hatte den gesamten Prozess, aber die kleinen Details haben mich
6

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.

Viktor Latypov
quelle
9
Dieser letzte Punkt ist ein bisschen umstritten, am besten! = Am einfachsten, viele ernsthafte Benutzeroberflächen sind noch in C ++ geschrieben. Alle Browser sind zum Beispiel, einschließlich Chrome, das neu ist und bei seiner Entwicklung zahlreiche Alternativen hatte.
Benj
2
OK. Genau. Es hängt alles ab. Wenn es um Portabilität geht, gibt es nicht viel zu überlegen, sondern C / C ++. Das Front-End kann jedoch plattformspezifisch implementiert werden, und C ++ kann für die gesamte Geschäftslogik verwendet werden.
Viktor Latypov
Die letzte, die Sie gesagt haben, als könnten wir eine andere Sprache zum Schreiben von GUI und C ++ verwenden, wird nur für den Kern verwendet? Woher?
Star Light
2

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 .

.

adembudak
quelle