2010-09-10 2 views
31

Ich bin nicht neu in C++, obwohl ich neu in Linux bin. Ich benutze CMake, um eine Cross-Plattform-Game-Engine mit einigen Drittanbietern vorzukompilieren, aber ich habe viele Zweifel an der Verwendung von Bibliotheken. Meine Frage ist, wie man mit Bibliotheken von Drittanbietern arbeitet. Und wo soll ich diese Bibliotheken hinstellen? Apt installiert libs an ihrem offiziellen Ort (/ usr/local,/usr/lib/..), aber ich entwickle in Windows mit lokalen Bibliotheken, die sich in einem Ordner befinden, in mein Projektverzeichnis.Wohin mit Bibliotheken von Drittanbietern, um eine C++ Linux-Entwicklungsumgebung einzurichten?

Auch brauche ich ein gutes Tutorial, um die Regeln kennen, wie Bibliotheken funktionieren. Zum Beispiel: wenn ich versuche, mein Projekt zu kompilieren, fragt luabind nach liblua.s0.1, aber AFAIK gibt es keine Möglichkeit, diese Bibliothek mit der von lua bereitgestellten Quelle zu erzeugen (zumindest make, make install).

Ich weiß, diese Frage ist verschwommen, aber ich habe nicht genug Erfahrung, um prägnanter zu sein.

update: Nach dem Lesen sombe Antworten ist eine prägnantere Frage die folgenden. Wie kann ich mein Programm verteilen, wenn ich alle Bibliotheken von Drittanbietern installiere? Wie man Abhängigkeiten verwaltet, ohne eine große Readme zu verwenden?

Vielen Dank für all starken Text

+0

Die LUA-Bibliothek wäre 'liblua.so.1', nicht' liblua.s0.1'. –

Antwort

47

Wo Bibliotheken setzen

Die beste Lösung Ihr Verpackungssystem der Linux-Distribution zu verwenden ist (apt-get, yum, oder ähnliches) Distro bereitgestellten Pakete Bibliotheken aus zu installieren.

Wenn die gepackten Bibliotheken der Distro nicht der neuesten Version entsprechen oder wenn Sie einige nicht standardmäßige Buildoptionen benötigen oder wenn Sie eine Bibliothek benötigen, die Ihre Distribution nicht bereitstellt, können Sie sie selbst erstellen und installieren. Sie haben zwei Möglichkeiten für, wo die Bibliothek setzen:

  • /usr/local (Bibliotheken unter /usr/local/lib, headers unter /usr/local/include). Dies installiert die Bibliotheken systemweit und ist wahrscheinlich die einfachste Lösung, da Sie dann in der Lage sein sollten, gegen sie zu arbeiten, ohne irgendwelche zusätzlichen Schritte zu unternehmen. Installieren Sie Bibliotheken NICHT direkt unter /usr, da dies das Verpackungssystem Ihrer Distribution beeinträchtigt.
  • Unter Ihrem Projektverzeichnis, wie Sie unter Windows getan haben. Dies hat den Vorteil, dass kein root-Zugriff erforderlich ist und keine systemweiten Änderungen vorgenommen werden müssen. Sie müssen jedoch die Include-Pfade und Bibliothekspfade des Projekts aktualisieren und alle gemeinsam genutzten Bibliotheksdateien an einem beliebigen Ort ablegen LD_LIBRARY_PATH oder ld.so.conf - siehe den Link für weitere Details).

Wie Bibliotheken arbeiten

Siehe David A. ausgezeichnete Programming Library HOWTO des Wheeler. Ich würde empfehlen, dass Sie dann bestimmte Fragen als neue Themen veröffentlichen.

Wie Ihr Programm

Traditionell Unix/Linux-Programme enthalten keine Kopien ihrer Abhängigkeiten verteilen. Es ist stattdessen Sache des Endbenutzers oder Entwicklers, diese Abhängigkeiten selbst zu installieren. Dies kann eine „große README“ erfordern, wie Sie gesagt haben, aber es hat einige Vorteile:

  • Entwicklungsbibliotheken können über die Distribution Paketmanager, statt jede Quelle Kopie mit seiner eigenen installiert, verwaltet und aktualisiert werden Reihe von zu verfolgenden Bibliotheken.
  • Es gibt nur eine Kopie einer bestimmten Bibliothek auf einem System. Es gibt also nur eine Stelle, die aktualisiert werden muss, wenn beispielsweise eine Sicherheitslücke gefunden wird. (Betrachten wir zum Beispiel das Chaos, das entstand, als zlib, eine sehr weit verbreitete Komprimierungsbibliothek, eine security flaw enthielt, so dass jede Anwendung aktualisiert werden musste, die eine betroffene Version enthielt.)
  • Wenn Ihr Programm beliebt genug ist (und ist Open Source oder zumindest frei verfügbar), dann könnten Paketbetreuer für verschiedene Linux-Distributionen es verpacken und es in ihre Distribution aufnehmen. Package Maintainer wirklich mag keine gebündelten Bibliotheken. Siehe beispielsweise Fedora's page on the topic.

Wenn Sie Ihr Programm sind der Verteilung von Benutzern zu beenden, können Sie ein Paket anbieten berücksichtigen wollen (.dpkg oder .rpm), dass sie einfach herunterladen konnte und installieren, ohne Quelle zu verwenden.Im Idealfall würde das Paket aus der Perspektive des Endbenutzers zu den Repositories von Distributionen hinzugefügt (wenn es Open Source oder zumindest frei verfügbar ist), so dass Benutzer es mit ihren Paketmanagern herunterladen können (apt-get oder yum). Dies kann aufgrund der großen Anzahl von Linux-Distributionen kompliziert werden, aber ein Debian/Ubuntu-kompatibler .dpkg und ein Red Hat/CentOS/Fedora-kompatibler .rpm sollten einen guten Prozentsatz der Endbenutzer abdecken. Pakete zu erstellen ist nicht zu schwer und es gibt gute Online-Howtos.

+1

Ich mag '/ opt' und verstaue – Anycorn

+0

Toller Ausgangspunkt !! Ich versuche das Gleiche zu tun wie in Windows. Ich meine: Wenn Sie eine clena VC++ Installation haben, können Sie mein Projekt kompilieren, weil alle Bibliotheken zusammen sind. In Linux möchte ich das Gleiche. Ich lese das Wie zu. Danke vielmals!!! – Killrazor

+1

Für normale Situationen, in denen es von allen benutzt wird, stimme ich/usr/local/X zu, aber wenn ich mit Bibliotheken arbeite, baue und debugge ich (viel) für mich (auch wenn ich der einzige bin, der das System benutzt) setze sie in ~/local/X –

1

Okay, so ist dies eine der grundlegenden Fragen, und während ich könnte ich nicht kommen über sehr klar zu diesem Thema, hier geht:

  1. Während eines Gebäude Projekt muss Ihr Compiler die Header-Dateien der Bibliotheken finden. Die Header müssen sich im Include-Pfad befinden.
  2. nach der Kompilierung wird der Linker nach den Binärdateien der Bibliothek suchen (files.so oder so ähnlich). Diese müssen sich im Bibliothekspfad befinden.

Das sind die Grundlagen.

Wenn Sie bestimmte Bibliotheken haben, können Sie diese Ihren eigenen projektspezifischen Verzeichnissen lib/ und include/ hinzufügen und sie dem Include-Pfad bzw. dem Bibliothekspfad hinzufügen.

Das Hinzufügen dieser Pfade zu diesen Pfaden kann auf verschiedene Arten erfolgen, je nachdem, wie Sie das Projekt erstellen. Ich bin mir sicher, dass da etwas namens LD_PATH involviert ist ... Aber ich kenne die Besonderheiten von CMake nicht wirklich.

Ein wenig googling kann Ihnen helfen, das oben genannte mit CMake zu tun.

Hoffnung, dass
JRH

+0

Für mich, libs in/usr/include zu setzen, ist wie Verzeichnisse in globalen Pfade Optionen in VC++ hinzufügen. In allen meinen Programmen lege ich alle Drittanbieter-Bibliotheken in meinen Projektordner, dann konfiguriere ich das Projekt (sehr einfach in VC++). Später, wenn ich mein Projekt verteilen muss, reicht es nur aus, eine saubere VC++ - Installation durchzuführen und ein Repository-Checkout durchzuführen, um mein Projekt zu kompilieren. Zumindest in Windows. Es ist genau das, wonach ich suche. – Killrazor

1

Wenn Sie installieren, die Bibliotheken mit einem Paket-Manager hilft, werden sie wahrscheinlich alle am Ende an der richtigen Stelle auf. Wenn nicht, können Sie den Compiler dazu veranlassen, nach dem zu suchen, indem Sie einen zusätzlichen Suchpfad mit dem Flag -L <path> bereitstellen. Sie sollten diese zusätzliche Flagge an CMake weitergeben können.

Übrigens kann die -I <path> verwendet werden, um ein zusätzliches Verzeichnis hinzuzufügen, um nach Include-Dateien zu suchen.wo immer möglich

1

für den ersten Teil Ihrer Frage zu Windows: Es gibt keinen echten Standardplatz für Bibliotheken/Header unter Windows, also ist die einfache Lösung: Erstellen Sie Ihre eigenen. Stellen Sie einfach eine einzige lib/und include/auf Ihrem System bereit und verwenden Sie alle Ihre Projekte (indem Sie den Pfad in einer cmake-Datei festlegen, die Sie überall einfügen). Legen Sie alle Dritten Libs dort in, zum Beispiel:

Ihre Projekte:

d:/projects/projectA 
d:/projects/projectB 

Dritter Sachen:

d:/api/lib/lua.lib 
d:/api/include/lua/.... 

(man kann sogar 'Verzeichnisabzweigungen' Symlinks aka verwenden, wenn Sie andere Version)

und die entsprechende cmake-Datei:

include_directories(d:/api/include) 
link_directories(d:/api/lib) 
Verwandte Themen