Lösung 1:
Ich entschuldige mich dafür, dass ich alles direkt beantworte, aber ich kenne keine nützlichen Tutorials, FAQs usw. Im Grunde genommen folgt darauf 8 Jahre Entwicklung von Desktop-Apps (die ich beim Verteilen helfe), Frustration und Googeln:
1. Wie finde ich heraus, welche Argumente an ./configure übergeben werden?
Wirklich üben. Autotools ist einfach genug, da es konsistent ist. Aber es gibt viele Dinge da draußen, die cmake oder benutzerdefinierte Build-Skripte verwenden. Im Allgemeinen sollten Sie nichts zum Konfigurieren übergeben müssen, es sollte herausfinden, ob Ihr System foo-tool erstellen kann oder nicht.
Configure- und GNU-Tools suchen alle in /, /usr und /usr/local nach Abhängigkeiten. Wenn Sie irgendetwas woanders installieren (was schmerzhaft ist, wenn die Abhängigkeit von MacPorts oder Fink installiert wurde), müssen Sie ein Flag übergeben, um die Umgebung der Shell zu konfigurieren oder zu modifizieren, damit GNU-Tools diese Abhängigkeiten finden können.
2. Wie Shared Libraries unter OS X / Linux funktionieren - wo sie im Dateisystem leben, wie ./configure &&make sie findet, was eigentlich passiert, wenn sie gelinkt werden
Unter Linux müssen sie in einem Pfad installiert werden, den der dynamische Linker finden kann, dies wird durch LD_LIBRARY_PATH
definiert Umgebungsvariable und den Inhalt von /etc/ld.conf. Auf dem Mac ist es für die meisten Open-Source-Software fast immer gleich (es sei denn, es handelt sich um ein Xcode-Projekt). Außer dass die env-Variable DYLD_LIBRARY_PATH
ist stattdessen.
Es gibt einen Standardpfad, den der Linker nach Bibliotheken durchsucht. Es ist /lib:/usr/lib:/usr/local/lib
Sie können dies ergänzen, indem Sie die CPATH-Variable oder CFLAGS oder eine beliebige Anzahl anderer Umgebungsvariablen verwenden (bequem kompliziert). Ich schlage CFLAGS wie folgt vor:
export CFLAGS="$CFLAGS -L/neu/Pfad"
Der Parameter -L fügt den Linkpfad hinzu.
Modern Stuff verwendet das Tool pkg-config. Modernes Zeug, das Sie installieren, installiert auch eine .pc-Datei, die die Bibliothek beschreibt und wo sie ist und wie man sie verlinkt. Das kann das Leben erleichtern. Aber es wird nicht mit OS X 10.5 geliefert, also müssen Sie das auch installieren. Auch viele grundlegende Deps unterstützen es nicht.
Der Vorgang des Verlinkens ist nur "diese Funktion zur Laufzeit auflösen", eigentlich ist es eine große String-Tabelle.
3. Was sind die tatsächlichen Unterschiede zwischen einer gemeinsam genutzten und einer statisch verknüpften Bibliothek? Warum kann ich nicht einfach alles statisch verlinken (RAM und Speicherplatz sind heutzutage billig) und so seltsame Bibliotheksversionskonflikte vermeiden?
Wenn Sie eine Verknüpfung zu einer statischen Bibliotheksdatei herstellen, wird der Code Teil Ihrer Anwendung. Es wäre, als ob es eine riesige .c-Datei für diese Bibliothek gäbe und Sie sie in Ihre Anwendung kompilieren würden.
Dynamische Bibliotheken haben denselben Code, aber wenn die App ausgeführt wird, wird der Code zur Laufzeit in die App geladen (vereinfachte Erklärung).
Sie können alles statisch verlinken, aber leider machen dies kaum Build-Systeme einfach. Sie müssten Build-Systemdateien manuell bearbeiten (z. B. Makefile.am oder CMakeLists.txt). Dies ist jedoch wahrscheinlich lohnenswert, wenn Sie regelmäßig Dinge installieren, die verschiedene Versionen von Bibliotheken erfordern, und Sie die parallele Installation von Abhängigkeiten als schwierig empfinden.
Der Trick besteht darin, die Linkzeile von -lfoo in -l/path/to/static/foo.a
zu ändernSie können wahrscheinlich finden und ersetzen. Überprüfen Sie anschließend, ob das Tool nicht mit .so oder dylib verknüpft ist, indem Sie ldd foo oder otool -L foo
verwendenEin weiteres Problem besteht darin, dass nicht alle Bibliotheken zu statischen Bibliotheken kompiliert werden. Viele tun es. Aber dann haben sich MacPorts oder Debian vielleicht entschieden, es nicht auszuliefern.
4. Wie kann ich feststellen, welche Bibliotheken ich installiert habe und welche Versionen?
Wenn Sie pkg-config-Dateien für diese Bibliotheken haben, ist es einfach:
pkg-config --list-all
Anders geht es oft nicht ohne weiteres. Die dylib kann einen Sonamen haben (z. B. foo.0.1.dylib, der Soname ist 0.1), der mit der Version der Bibliothek identisch ist. Dies ist jedoch nicht erforderlich. Der Soname ist ein binäres Berechenbarkeitsmerkmal, Sie müssen den größten Teil des Sonames ändern, wenn Sie das Format der Funktionen in der Bibliothek ändern. So bekommt man zB. Version 14.0.5 soname für eine 2.0-Bibliothek. Obwohl dies nicht üblich ist.
Ich war von solchen Dingen frustriert und habe eine Lösung dafür auf dem Mac entwickelt, und ich werde als nächstes darüber sprechen.
5. Wie kann ich mehr als eine Version einer Bibliothek installieren, ohne mein normales System zu beschädigen?
Meine Lösung dafür ist hier:http://github.com/mxcl/homebrew/
Ich installiere gerne von der Quelle und wollte ein Tool, das es einfach macht, aber mit etwas Paketverwaltung. Also mit Homebrew baue ich zB. wholen Sie sich aus dem Quellcode, aber stellen Sie sicher, dass Sie mit einem speziellen Präfix installieren:
/usr/local/Cellar/wget/1.1.4
Ich verwende dann das Homebrew-Tool, um all das symbolisch in /usr/local zu verlinken, sodass ich immer noch /usr/local/bin/wget und /usr/local/lib/libwget.dylib
habeWenn ich später eine andere Version von wget benötige, kann ich sie parallel installieren und einfach die Version ändern, die in den /usr/local-Baum verlinkt ist.
6. Wenn ich Dinge aus den Quellen auf einem System installiere, das ansonsten mit Paketen verwaltet wird, was ist der sauberste Weg, dies zu tun?
Ich glaube, der Homebrew-Weg ist am saubersten, also verwenden Sie ihn oder tun Sie das Äquivalent. Installiere nach /usr/local/pkgs/name/version und verlinke den Rest per Symlink oder Hardlink.
Verwenden Sie /usr/local. Jedes existierende Build-Tool sucht dort nach Abhängigkeiten und Headern. Ihr Leben wird viel sein einfacher.
7. Angenommen, ich schaffe es, etwas Fummeliges aus der Quelle zu kompilieren, wie kann ich das dann so verpacken, dass andere Leute nicht durch dieselben Reifen springen müssen? Besonders unter OS X....
Wenn es keine Abhängigkeiten hat, können Sie das Build-Verzeichnis tarieren und an jemand anderen weitergeben, der dann "make install" ausführen kann. Sie können dies jedoch nur zuverlässig für genau dieselben Versionen von OS X tun. Unter Linux wird es wahrscheinlich für ähnliche Linux (z. B. Ubuntu) mit derselben Kernel-Version und libc-Minor-Version funktionieren.
Der Grund, warum es nicht einfach ist, Binärdateien unter Unix zu verteilen, liegt in der Binärkompatibilität. Die GNU-Leute und alle anderen ändern oft ihre Binärschnittstellen.
Verteilen Sie grundsätzlich keine Binärdateien. Die Dinge werden wahrscheinlich auf sehr seltsame Weise kaputt gehen.
Auf dem Mac ist es am besten, ein Macports-Paket zu erstellen. Jeder nutzt Macports. Unter Linux gibt es so viele verschiedene Build-Systeme und -Kombinationen, dass es meiner Meinung nach keinen besseren Rat gibt, als einen Blog-Eintrag darüber zu schreiben, wie es Ihnen gelungen ist, x-Tool in y seltsamer Konfiguration zu bauen.
Wenn Sie eine Paketbeschreibung (für Macports oder Homebrew) erstellen, kann jeder dieses Paket installieren, und es löst auch die Abhängigkeitsprobleme. Dies ist jedoch oft nicht einfach, und es ist auch nicht einfach, Ihr Macports-Rezept in den Macports-Hauptbaum aufzunehmen. Außerdem unterstützt Macports keine exotischen Installationstypen, sie bieten eine Auswahl für alle Pakete.
Eines meiner zukünftigen Ziele mit Homebrew ist es, es zu ermöglichen, auf einen Link auf einer Website zu klicken (z. B. homebrew://blah, und es wird dieses Ruby-Skript herunterladen, die Deps für dieses Paket installieren und dann die App erstellen. Aber ja, noch nicht fertig, aber angesichts des von mir gewählten Designs nicht zu schwierig.
8. Welche Kommandozeilen-Tools muss ich beherrschen, um in diesen Dingen gut zu werden? Sachen wie otool, pkg-config etc.
otool ist wirklich nur im Nachhinein sinnvoll. Es sagt Ihnen, womit die erstellte Binärdatei verknüpft ist. Wenn Sie die Abhängigkeiten eines zu erstellenden Tools herausfinden, ist dies nutzlos. Dasselbe gilt für pkg-config, da Sie die Abhängigkeit bereits installiert haben, bevor Sie es verwenden können.
Meine Toolkette ist, lesen Sie die README- und INSTALL-Dateien und führen Sie eine configure --help aus. Sehen Sie sich die Build-Ausgabe an, um zu überprüfen, ob sie korrekt ist. Analysieren Sie alle Build-Fehler. Vielleicht in Zukunft auf Serverfault fragen :)
Lösung 2:
Dies ist ein großes Thema, also fangen wir mit gemeinsam genutzten Bibliotheken unter Linux (ELF unter Linux und Mach-O unter OS X) an. Ulrich Drepper hat eine gute Einführung in das Schreiben von DSOs (Dynamic Shared Objects), die einen Teil der Geschichte der verfügbaren gemeinsam genutzten Bibliotheken unter Linux abdeckt hier, einschließlich warum sie wichtig sind
Ulrich beschreibt auch, warum die statische Verlinkung als schädlich angesehen wird. Einer der wichtigsten Punkte hier sind Sicherheitsupdates. Pufferüberläufe in einer gängigen Bibliothek (z. B. zlib), die umfangreich statisch gelinkt ist, können einen enormen Overhead für Distributionen verursachen - dies trat bei zlib 1.1.3 (Red Hat Advisory) auf
ELF
Die Handbuchseite des Linkers ld.so
man ld.so
erklärt die grundlegenden Pfade und Dateien, die beim dynamischen Linken zur Laufzeit beteiligt sind. Auf modernen Linux-Systemen sehen Sie zusätzliche Pfade, die über /etc/ld.so.conf.d/ hinzugefügt werden, normalerweise über ein Glob-Include in /etc/ld.so.conf.
Wenn Sie sehen möchten, was dynamisch über Ihre ld.so-Konfiguration verfügbar ist, können Sie
ausführenldconfig -v -N -X
Das Lesen der DSO-Anleitung sollte Ihnen ein gutes Grundwissen vermitteln, um dann zu verstehen, wie diese Prinzipien auf Mach-O unter OS X angewendet werden.
Mach-O
Unter OS X ist das Binärformat Mach-O. Lokale Systemdokumentation für den Linker ist
man dyld
Die Dokumentation zum Mach-Format ist von Apple erhältlich
UNIX-Build-Tools
Die gemeinsame configure
, make
, make install
Der Prozess wird im Allgemeinen von GNU Autotools bereitgestellt, das über ein Online-Buch verfügt, das einen Teil der Geschichte der Konfiguration/Erstellung und der GNU-Toolchain abdeckt. Autoconf verwendet Tests, um die Verfügbarkeit von Funktionen auf dem Ziel-Build-System zu bestimmen, es verwendet die M4-Makrosprache, um dies zu steuern. Automake ist im Grunde eine Templating-Methode für Makefiles, wobei das Template im Allgemeinen Makefile.am heißt, das ein Makefile.in ausgibt, das die Ausgabe von autoconf (dem Konfigurationsskript) in ein Makefile umwandelt.
Das GNU-Hello-Programm ist ein gutes Beispiel für das Verständnis der GNU-Toolchain - und das Handbuch enthält eine Autotools-Dokumentation.
Lösung 3:
Simon! Ich weiß wie du dich fühlst; Ich hatte auch mit diesem Teil des Linux-Lernens zu kämpfen. Basierend auf meinen eigenen Erfahrungen habe ich ein Tutorial über einige der Punkte geschrieben, die Sie ansprechen (hauptsächlich als Referenz für mich selbst!):http://easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html. Ich denke, Sie werden meinen Hinweis darüber zu schätzen wissen, wie einfach Python-Anwendungen zu erstellen/installieren sind. :)
Hoffe das hilft! Und viel Spaß beim Kompilieren.
Tim Jones
Erstellen/Installieren einer Anwendung aus dem Quellcode in Ubuntu Linux
Während die Ubuntu-Repositories randvoll mit großartigen Anwendungen sind, werden Sie irgendwann auf dieses "must-have"-Tool stoßen, das nicht in den Repositories ist (oder kein Debian-Paket hat) oder Sie brauchen ein neuere Version als in den Repositories. Wie geht's? Nun, Sie müssen die Anwendung aus dem Quellcode erstellen! Keine Sorge, es ist wirklich nicht so kompliziert, wie es sich anhört. Hier sind einige Tipps, basierend auf meinen Erfahrungen als reiner Amateur! (Obwohl ich für dieses Beispiel Ubuntu verwende, sollten die allgemeinen Konzepte auf die meisten Unix/Linux-Distributionen wie Fedora und sogar die Cygwin-Plattform unter Windows anwendbar sein.)
Der grundlegende Prozess zum Erstellen (Kompilieren) der meisten Anwendungen aus dem Quellcode folgt dieser Reihenfolge:konfigurieren --> kompilieren --> installieren. Die typischen Unix/Linux-Befehle für diese Dinge sind:config
--> make
--> make install
. In einigen Fällen finden Sie sogar Webseiten, die zeigen, dass all dies in einem einzigen Befehl kombiniert werden kann:
$ config && make && make install
Natürlich geht dieser Befehl davon aus, dass es bei keinem dieser Schritte Probleme gibt. Hier kommt der Spaß ins Spiel!
Erste Schritte
Wenn Sie noch nie eine Anwendung aus dem Quellcode auf Ihrem System kompiliert haben, müssen Sie sie wahrscheinlich mit einigen allgemeinen Entwicklungstools einrichten, wie z. B. gcc
Compiler-Suite, einige gemeinsame Header-Dateien (stellen Sie sich dies als Code vor, der bereits von jemand anderem geschrieben wurde und von dem Programm verwendet wird, das Sie installieren) und das Make-Tool. Glücklicherweise gibt es in Ubuntu ein Metapaket namens build-essential
das wird davon installieren. Um es zu installieren (oder einfach sicherzustellen, dass Sie es bereits haben!), führen Sie diesen Befehl im Terminal aus:
$ sudo apt-get install build-essential
Nachdem Sie nun die Grundeinstellungen vorgenommen haben, laden Sie die Quelldateien der Anwendung herunter und speichern Sie sie in einem Verzeichnis, für das Sie Lese-/Schreibberechtigungen haben, z. B. in Ihrem „Home“-Verzeichnis. Normalerweise befinden sich diese in einer Archivdatei mit der Dateierweiterung .tar.gz
oder .tar.bz2
. Die .tar
bedeutet einfach, dass es sich um ein "Bandarchiv" handelt, bei dem es sich um eine Gruppierung von Dateien handelt, die ihre relative Verzeichnisstruktur beibehalten. Die .gz
steht für gzip (GNU zip), ein beliebtes Unix/Linux-Komprimierungsformat. Ebenso die .bz2
steht für bzip2, ein neueres Komprimierungsformat, das eine höhere Komprimierung (kleinere komprimierte Dateigröße) als gzip bietet.
Nachdem Sie die Quelldatei heruntergeladen haben, öffnen Sie ein Terminalfenster (System Terminal aus dem Ubuntu-Menü) und wechseln Sie in das Verzeichnis, in dem Sie Ihre Datei gespeichert haben. (Ich verwende ~/download
in diesem Beispiel. Hier ist '~' eine Abkürzung zu Ihrem "Home"-Verzeichnis.) Verwenden Sie den tar-Befehl, um die Dateien aus der heruntergeladenen Archivdatei zu extrahieren:
Wenn Ihre Datei ein gzip-Archiv ist (z. B. endet mit .tar.gz
), verwenden Sie den Befehl:
$ tar -zxvf filename.tar.gz
Wenn Ihre Datei ein bzip2-Archiv ist (z. B. endet mit .tar.bz2
), verwenden Sie den Befehl:
$ tar -jxvf filename.tar.gz
Tipp:Wenn Sie sich nicht alle Befehlszeilenoptionen zum Extrahieren von Archiven merken müssen, empfehle ich Ihnen, sich eines (oder beide) dieser Dienstprogramme zu besorgen:dtrx (mein Favorit!) oder deco (beliebter). Bei beiden Dienstprogrammen geben Sie einfach den Namen des Dienstprogramms (dtrx oder deco) und den Dateinamen ein, der Rest wird erledigt. Beide „wissen“, wie sie mit den meisten Archivformaten umgehen, auf die Sie wahrscheinlich stoßen werden, und sie haben eine hervorragende Fehlerbehandlung.
Beim Erstellen aus dem Quellcode gibt es zwei häufige Arten von Fehlern, auf die Sie wahrscheinlich stoßen werden:
- Konfigurationsfehler treten auf, wenn Sie das Konfigurationsskript (normalerweise config oder configure genannt) ausführen, um ein für Ihr Setup spezifisches Makefile zu erstellen.
- Compilerfehler treten auf, wenn Sie den make-Befehl ausführen (nachdem das Makefile generiert wurde) und der Compiler den benötigten Code nicht finden kann.
Wir werden uns jedes dieser Probleme ansehen und besprechen, wie sie gelöst werden können.
Konfiguration und Konfigurationsfehler
Nachdem Sie die Quellcode-Archivdatei extrahiert haben, sollten Sie im Terminal in das Verzeichnis wechseln, das die extrahierten Dateien enthält. Normalerweise ist dieser Verzeichnisname derselbe wie der Name der Datei (ohne den .tar.gz
oder .tar.bz2
Verlängerung). Manchmal ist der Verzeichnisname jedoch nur der Name der Anwendung ohne Versionsinformationen.
Suchen Sie im Quellverzeichnis nach einem README
Datei und/oder ein INSTALL
Datei (oder etwas mit ähnlichen Namen). Diese Dateien enthalten in der Regel nützliche Informationen zum Erstellen/Kompilieren der Anwendung und zum Installieren, einschließlich Informationen zu Abhängigkeiten. "Abhängigkeiten" sind nur ein ausgefallener Name für andere Komponenten oder Bibliotheken, die für eine erfolgreiche Kompilierung erforderlich sind.
Nachdem Sie den README
gelesen haben und/oder INSTALL
Datei (und hoffentlich alle relevanten Online-Dokumentationen für die Anwendung durchgesehen), suchen Sie nach einer ausführbaren Datei (mit der Berechtigung "x" für die Datei) namens config
oder configure
. Manchmal kann die Datei eine Erweiterung haben, z. B. .sh
(z. B. config.sh
). Dies ist normalerweise ein Shell-Skript, das einige andere Dienstprogramme ausführt, um zu bestätigen, dass Sie eine "gesunde" Umgebung zum Kompilieren haben. Mit anderen Worten, es wird überprüft, ob Sie alles installiert haben, was Sie benötigen.
Tipp:Wenn es sich um eine Python-basierte Anwendung handelt, sollten Sie anstelle einer Konfigurationsdatei eine Datei mit dem Namen setup.py
finden .Python-Anwendungen sind in der Regel sehr einfach zu installieren. Um diese Anwendung zu installieren, führen Sie als root (z. B. setzen Sie sudoin vor den folgenden Befehl unter Ubuntu) diesen Befehl aus:
$ python setup.py install
Das sollte alles sein, was Sie tun müssen. Sie können den Rest dieses Tutorials überspringen und direkt mit der Verwendung und Freude an Ihrer Anwendung fortfahren.
Führen Sie das Konfigurationsskript im Terminal aus. Normalerweise können (und sollten!) Sie Ihr Konfigurationsskript mit Ihrem regulären Benutzerkonto ausführen.
$ ./config
Das Skript zeigt einige Meldungen an, um Ihnen eine Vorstellung davon zu geben, was es tut. Oft gibt Ihnen das Skript einen Hinweis darauf, ob es erfolgreich war oder fehlgeschlagen ist, und, wenn es fehlgeschlagen ist, einige Informationen über die Ursache des Fehlers. Wenn Sie keine Fehlermeldungen erhalten, können Sie in der Regel davon ausgehen, dass alles geklappt hat.
Wenn Sie kein Skript finden, das wie ein Konfigurationsskript aussieht, bedeutet dies normalerweise, dass die Anwendung sehr einfach und plattformunabhängig ist. Das bedeutet, dass Sie einfach zum Build/Compile-Schritt weiter unten springen können, da der bereitgestellte Makefile
sollte auf jedem System funktionieren.
Ein Beispiel
In diesem Tutorial werde ich den textbasierten RSS-Reader namens Newsbeuter als Beispiel für die Arten von Fehlern verwenden, auf die Sie beim Erstellen Ihrer Anwendung stoßen können. Für Newsbeuter lautet der Name des Konfigurationsskripts config.sh
. Auf meinem System, wenn ich config.sh
ausführe , treten die folgenden Fehler auf:
[email protected]:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found
You need package sqlite3 in order to compile this program.
Please make sure it is installed.
Als ich ein wenig recherchiert habe, habe ich herausgefunden, dass es tatsächlich der sqlite3
ist Anwendung installiert wurde. Da ich jedoch versuche, aus dem Quellcode zu bauen, ist dies ein Tipp, was config.sh
ist tatsächlich gesucht wird, sind die Entwicklungsbibliotheken (Header) für sqlite3
. In Ubuntu haben die meisten Pakete ein zugehöriges Entsprechungspaket für die Entwicklung, das auf -dev
endet . (Andere Plattformen wie Fedora verwenden oft ein Paketsuffix von -devel
für die Entwicklungspakete.)
Um das passende Paket für den sqlite3
zu finden Entwicklungspaket können wir den apt-cache
verwenden Dienstprogramm in Ubuntu (und ähnlich das yum
Dienstprogramm in Fedora):
[email protected]:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite
Dieser Befehl gibt eine ziemlich große Liste von Ergebnissen zurück, daher müssen wir ein wenig Detektivarbeit leisten, um festzustellen, welches das geeignete Paket ist. In diesem Fall stellt sich heraus, dass das passende Paket libsqlite3-dev
ist . Beachten Sie, dass das Paket, nach dem wir suchen, manchmal den lib
enthält Präfix, anstatt nur den gleichen Paketnamen plus -dev
. Dies liegt daran, dass wir manchmal nur nach einer gemeinsam genutzten Bibliothek suchen, die von vielen verschiedenen Anwendungen verwendet werden kann. Um libsqlite3-dev
zu installieren , führen Sie den typischen Befehl apt-get install im Terminal aus:
[email protected]:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev
Jetzt müssen wir config.sh
ausführen erneut, um sicherzustellen, dass wir dieses Abhängigkeitsproblem gelöst haben und keine Abhängigkeitsprobleme mehr haben. (Obwohl ich es hier nicht zeigen werde, musste ich im Fall von Newsbeuter auch den libcurl4-openssl-dev
installieren Paket.) Auch wenn Sie ein Entwicklungspaket installieren (wie libsqlite3-dev
) und das zugehörige Anwendungspaket (z. B. sqlite3
) noch nicht installiert ist, installieren die meisten Systeme gleichzeitig automatisch das zugehörige Anwendungspaket.
Wenn die Konfiguration erfolgreich ausgeführt wird, werden als Ergebnis eine oder mehrere Make-Dateien erstellt. Diese Dateien heißen normalerweise Makefile
(Denken Sie daran, dass die Groß-/Kleinschreibung von Dateinamen in Unix/Linux wichtig ist!). Wenn das Erstellungspaket Unterverzeichnisse wie src
enthält usw., enthält jedes dieser Unterverzeichnisse einen Makefile
, sowie.
Erstellungs- und Kompilierungsfehler
Jetzt können wir die Anwendung tatsächlich kompilieren. Dies wird oft als Bauen bezeichnet und der Name ist dem realen Prozess des Bauens von etwas entlehnt. Die verschiedenen "Teile" der Anwendung, bei denen es sich typischerweise um mehrere Quellcodedateien handelt, werden miteinander kombiniert, um die Gesamtanwendung zu bilden. Das Dienstprogramm make verwaltet den Erstellungsprozess und ruft andere Anwendungen wie den Compiler und den Linker auf, um die eigentliche Arbeit zu erledigen. In den meisten Fällen führen Sie einfach make (mit Ihrem regulären Benutzerkonto) aus dem Verzeichnis aus, in dem Sie die Konfiguration ausgeführt haben. (In einigen Fällen, z. B. beim Kompilieren von Anwendungen, die mit der Qt-Bibliothek geschrieben wurden, müssen Sie stattdessen eine andere „Wrapper“-Anwendung wie qmake ausführen. Überprüfen Sie auch hier immer den README
und/oder INSTALL
Dokumente für Details.)
Wie beim obigen Konfigurationsskript werden beim Ausführen von make (oder einem ähnlichen Dienstprogramm) im Terminal einige Meldungen darüber angezeigt, was ausgeführt wird, sowie Warnungen und Fehler. Sie können Warnungen normalerweise ignorieren, da sie hauptsächlich für die Entwickler der Anwendung bestimmt sind und ihnen mitteilen, dass gegen einige Standardpraktiken verstoßen wird. Normalerweise wirken sich diese Warnungen nicht auf die Anwendungsfunktion aus. Andererseits müssen Compilerfehler behandelt werden. Mit Newsbeuter lief es eine Weile gut, als ich make ausgeführt habe, aber dann bekam ich einen Fehler:
[email protected]:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1
Der Make-Prozess wird beendet, sobald der erste Fehler auftritt. Der Umgang mit Compilerfehlern kann manchmal eine knifflige Angelegenheit sein. Sie müssen sich die Fehler ansehen, um Hinweise auf das Problem zu erhalten. Typischerweise besteht das Problem darin, dass einige Header-Dateien, die normalerweise die Erweiterung .h
haben, vorhanden sind oder .hpp
, fehlen. Im Fall des obigen Fehlers ist (oder sollte!) klar, dass das Problem stfl.h
ist Header-Datei kann nicht gefunden werden. Wie dieses Beispiel zeigt, sollten Sie sich die ersten Zeilen der Fehlermeldung ansehen und sich nach unten arbeiten, um die zugrunde liegende Ursache des Problems zu finden.
Nachdem ich mir die Newsbeuter-Dokumentation angesehen hatte (was ich hätte tun sollen, bevor ich anfing, aber dann wäre dieser Teil des Tutorials nicht sehr aussagekräftig!), stellte ich fest, dass dafür eine Bibliothek eines Drittanbieters namens STFL erforderlich war. Was machen wir also in diesem Fall? Nun, wir wiederholen im Wesentlichen genau denselben Prozess für diese erforderliche Bibliothek:Besorgen Sie sich die Bibliothek und führen Sie den Konfigurations-Build-Install-Prozess dafür aus und fahren Sie dann mit dem Erstellen der gewünschten Anwendung fort. Zum Beispiel musste ich im Fall von STFL den libncursesw5-dev
installieren Paket, damit es richtig gebaut werden kann. (Normalerweise ist es nicht notwendig, den Konfigurationsschritt unserer ursprünglichen Anwendung nach der Installation einer anderen erforderlichen Anwendung zu wiederholen, aber es schadet auch nie.)
Nach erfolgreicher Installation des STFL-Toolkits lief der Make-Prozess für Newsbeuter erfolgreich. Der Make-Prozess setzt normalerweise dort fort, wo er aufgehört hat (am Punkt des Fehlers). Daher werden alle Dateien, die bereits erfolgreich kompiliert wurden, nicht erneut kompiliert. Wenn Sie alles neu kompilieren möchten, können Sie make clean all ausführen, um alle kompilierten Objekte zu entfernen, und dann make erneut ausführen.
Installieren
Nachdem der Erstellungsprozess erfolgreich abgeschlossen wurde, können Sie die Anwendung installieren. Um die Anwendung in den meisten Fällen in den gemeinsamen Bereichen des Dateisystems zu installieren (z. B. /usr/bin
oder /usr/share/bin
, usw.), müssen Sie die Installation als root ausführen. Die Installation ist wirklich der einfachste Schritt im gesamten Prozess. Führen Sie zur Installation im Terminal Folgendes aus:
$ make install
Überprüfen Sie die Ausgabe dieses Prozesses auf Fehler. Wenn alles erfolgreich war, sollten Sie den Befehlsnamen im Terminal ausführen können und es wird gestartet. (Fügen Sie &an das Ende der Befehlszeile an, wenn es sich um eine GUI-Anwendung handelt, oder Sie können die Terminalsitzung nicht verwenden, bis die Anwendung beendet ist.)
Wenn Sie eine Anwendung aus dem Quellcode erstellen, wird den GUI-Menüs in Ubuntu normalerweise kein Symbol oder keine Verknüpfung hinzugefügt. Sie müssen dies manuell hinzufügen.
Und das ist im Grunde der Prozess, wenn auch möglicherweise iterativ, zum Erstellen und Installieren einer Anwendung aus der Quelle in Ubuntu. Nachdem Sie dies nur ein paar Mal getan haben, wird es Ihnen in Fleisch und Blut übergehen!
Lösung 4:
Nun, ./configure --help gibt Ihnen viele Informationen für die von GNU Autotools generierten Konfigurationsdateien. Das meiste davon läuft auf --with/--without hinaus, um Funktionen zu aktivieren (diese können einen zusätzlichen Parameter wie "shared" benötigen, um anzugeben, wo die Bibliothek zu finden ist).
Andere wichtige sind --prefix (was meistens standardmäßig /usr/local/ ist), um anzugeben, wohin installiert werden soll (wenn Sie Pakete erstellen, möchten Sie dies normalerweise als --prefix=/usr oder vielleicht --prefix =/opt/IhrPaket).
Unter Linux werden /lib, /usr/lib und /usr/local/lib im Allgemeinen in gcc durchsucht und sind in der Standardkonfiguration von ldconfig enthalten. Sofern Sie keinen guten Grund haben, möchten Sie hier Ihre Bibliotheken haben. /etc/ld.so.conf kann jedoch zusätzliche Einträge auflisten.
Konfigurieren und finden Sie sie, indem Sie einfach versuchen, "gcc -l" auszuführen und zu sehen, ob es Fehler gibt. Sie können Ihrem CFLAGS-Parameter "-L" hinzufügen, um zusätzliche Suchpfade hinzuzufügen.
Sie können mehrere Versionen installiert haben, und Software, die mit einer älteren Version verknüpft ist, bleibt damit verknüpft (führen Sie ldd aus, um die Bindung unter Linux herauszufinden), aber neue Kompilierungen zielen im Allgemeinen auf die neueste Version einer dynamischen Bibliothek auf Ihrem System ab.
Die meiste Software setzt dynamische Bibliotheken voraus, insbesondere wenn sie libtool verwendet, sodass Sie möglicherweise feststellen, dass nicht triviale Apps statisch nicht korrekt erstellt werden.
ls -l ist die beste Wahl, um installierte Bibliotheken zu finden.
Und da gehen mir die Informationen aus; wie man gut mit Paketen spielt:keine Ahnung. Wenn möglich, versuche ich, die Dinge in ein Paket zu packen, um das Problem zu vermeiden.
Lösung 5:
Um ein wenig auf Ihre Frage zu antworten, ich habe neulich einen guten Weg gefunden, um zu sehen, welche Bibliotheken Sie installiert haben und welche Versionen (Dies ist unter Linux Debian, sollte also auch mit anderen Versionen funktionieren).
dpkg --list
Sie sollten eine wirklich lange Liste mit einer Ausgabe wie dieser erhalten
ii libssl0.9.8 0.9.8c-4etch5 SSL shared libraries
ii libssp0 4.1.1-21 GCC stack smashing protection library
ii libstdc++5 3.3.6-15 The GNU Standard C++ Library v3
ii libstdc++5-3.3 3.3.6-15 The GNU Standard C++ Library v3 (development
ii libstdc++6 4.1.1-21 The GNU Standard C++ Library v3