Gerade habe ich begonnen, das Buch zu lesen: Fortgeschrittene Programmierung in der UNIX®-Umgebung . Ich wollte versuchen, sein erstes Codebeispiel auszuführen. Ich verwende Scientific Linux 6.4.
Ich habe den Quellcode heruntergeladen und, wie in der README- make
Datei angegeben, die unkomprimierte Datei ausgeführt.
Ich habe das erste Programm geschrieben (ein Scheinbefehl ls
)
#include "./include/apue.h"
#include <dirent.h>
int
main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
if(argc!=2)
err_quit("usage: test directory_name");
if((dp=opendir(argv[1]))==NULL)
err_sys("Can't open %s", argv[1]);
while((dirp=readdir(dp))!=NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
return 0;
}
und legen Sie es in die unkomprimierte Datei. Als das Buch geraten hatte ich dann lief: gcc myls.c
. Aber ich bekomme diesen Fehler:
# gcc myls.c
/tmp/ccWTWS2I.o: In function `main':
test.c:(.text+0x20): undefined reference to `err_quit'
test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status
Ich wollte wissen, wie ich dieses Problem beheben kann. Ich möchte auch in der Lage sein, einen Code auszuführen, den ich in ein beliebiges Verzeichnis schreibe.
err_{quit,sys}
zu kommen?include
mit der Header-Dateiapue.h
. Dies ist jedoch die einzige Datei in diesem Verzeichnis. Ich verstehe nicht, wo die tatsächlichen Funktionsdefinitionen sind! Ich dachte, dass jemand mit der Struktur der Quellcodedatei dieses Buches hier vertraut ist..h
Dateien enthalten die Prototypen für die Funktionen. Ihre Implementierungen sind in.so
oder.a
Dateien, die auf der Box vorhanden sein müssen. Dies sind dynamische und statische Bibliotheken, die die Funktionen enthalten.apue.h
?Antworten:
Ein kurzer Überblick über das Schreiben und Kompilieren der Programme in Advanced Programming in der UNIX®-Umgebung . Wir danken slm für das Verständnis der Schritte. Sie können den Quellcode hier herunterladen . Ich wünschte, diese Informationen wären in Anhang b des Buches enthalten, in dem die Header-Datei erklärt wird.
Die unkomprimierte Datei enthält Verzeichnisse mit den Namen der Kapitel sowie zwei weitere mit dem Namen
include
undlib
. Diejenigen mit den Namen der Kapitel enthalten alle Programme dieses Kapitels.Das
include
Verzeichnis enthält die Header - Datei , die in den meisten der Programme in dem Buch verwendet wird:apue.h
. Daslib
Verzeichnis enthält den Quellcode der Implementierungen für diesen Header.Nehmen wir an, die unkomprimierte Datei befindet sich unter:,
SCADDRESS/
zum Beispiel könnte es sein:/home/yourid/Downloads/apue.3e/
Sobald Sie den Quellcode dekomprimiert haben, gehen Sie in das Verzeichnis und führen Sie Folgendes aus
make
:make
Kompiliert alle Programme in allen Kapiteln. Wichtig ist jedoch, dass vorher die Bibliothek erstellt wird, die die Implementierungen der Funktionen in enthältapue.h
.Führen Sie zum Kompilieren eines Beispielprogramms, das Sie aus dem Buch schreiben, den folgenden GCC-Befehl aus (vorausgesetzt, der Name Ihres Programms
myls.c
ist der erste im Buch):-I
Gibt an, ingcc
welchem Verzeichnis nach der Include-Datei gesucht werden soll.-L
gibt den Speicherort des Bibliotheksverzeichnisses und-lapue
den Namen der Bibliotheksdatei an, nach der in diesem Verzeichnis gesucht werden soll. -LXXX bedeutet, im Bibliotheksverzeichnis nach einer Datei mit dem Namen libXXX.a oder libXXX.so zu suchen.quelle
-Wall
dengcc
Befehl zu ergänzen , um ihn häufiger warnen zu lassen.Ich denke, diese Stapelüberlauf-Fragen und Antworten mit dem Titel: Wo ist die Funktion err_sys () definiert? hat was du brauchst. 2 der Antworten in diesem Thread hatten folgendes zu sagen:
A1
A2
Verweise
quelle
err_sys
ist nur ein Beispiel, es gibt andere Funktionen in dieser Header-Datei. Daher suche ich nach einer allgemeinen Antwort auf dieses Problem (wie die Header-Datei eingefügt und erfolgreich kompiliert werden kann), ohne diese bestimmte Funktion neu zu schreiben.gcc
mit-L
Argumenten Referenzierung der Bibliotheken zu verwenden. Die Bibliotheken sind die.so
oder.a
Dateien. Dieses Tutorial kann hilfreich sein, um sich mit w /gcc
, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html vertraut zu machen . Insbesondere dieser Abschnitt: "Suchen nach Header-Dateien undgcc -o myls myls.c -L LIBPOSITION -lapue
. Wobei sich LIBPOSITION imlib
Verzeichnis des nicht komprimierten Verzeichnisses befindet. Danke noch einmal.Die folgenden Schritte haben bei mir funktioniert (Ubuntu 14.04 64bit):
wget http://www.apuebook.com/src.3e.tar.gz
Laden Sie das gzipped tar-Archiv von der offiziellen Buchseite heruntertar xzf src.3e.tar.gz
Dadurch wird der entpackte Ordner erstellt, der standardmäßigapue.3e
unter dem aktuellen Verzeichnis aufgerufen wirdcd apue.3e
sudo apt-get install libbsd-dev
. Dies ist für den Link -lbsd in / threadsmake
Dadurch wird automatisch der gesamte Quellcode in allen Ordnern kompiliertcd intro
./ls1 ..
funktioniert dann wie erwartet (listet Dateien aus dem übergeordneten Verzeichnis auf)Möglicherweise müssen Sie sich umsehen, um andere Codefragmente aus dem Buch zu finden, aber es sollte unkompliziert sein.
quelle
Was makhlighi in seinem letzten Kommentar erklärt hat, hat für mich funktioniert, aber ich musste einen anderen Quellcode verwenden als den der offiziellen Website www.apuebook.com.
Die von mir verwendete finden Sie unter https://github.com/roktas/apue2e . Wie jemand erklärte, wurde dieses implementiert, um mit einem modernen Linux-System zu arbeiten.
quelle
Ich habe die Bibliothek erfolgreich mithilfe der hier angegebenen Befehlszeilenanweisung erstellt. Ich hatte Schwierigkeiten, ein Beispiel in Xcode zu erstellen. Um dies zu erreichen, habe ich die Suchpfade für die Header-Dateien und die Bibliotheken definiert (Bereich "Build Settings"). Dann habe ich die Bibliothek selbst im Bereich "Build Phases" als "Link Binary With Libraries" definiert. Danach ist es ein Kinderspiel.
quelle
Wenn apue.3e installiert ist, können Sie versuchen, apue in das Standardverzeichnis zu kopieren. Beispiel:
Wenn der Code kompiliert ist, fügen Sie bitte das Argument hinzu:
-lapue
quelle
'err_sys' und 'err_quit' befinden sich in einer Datei namens 'errno.c', die sich nicht in Ihrem aktuellen Arbeitsverzeichnis befindet. Öffnen Sie zunächst den Ordner 'apue', den Sie heruntergeladen und dekomprimiert haben, und kopieren Sie alle Elemente in diesem Ordner, z. B. advio, daemons usw., in Ihr aktuelles Arbeitsverzeichnis Mit dem Befehl 'pwd'. Jetzt finden Sie im Ordner 'include' die Header-Datei apue. Kopieren Sie diese ebenfalls in Ihr aktuelles Arbeitsverzeichnis. Kurz gesagt, jede .c-Datei, die Sie in Ihrem Programm verwenden möchten, muss Sie befinden sich in Ihrem aktuellen Arbeitsverzeichnis. Kopieren Sie daher alle diese Dateien in Ihr aktuelles Arbeitsverzeichnis.
Nun, um Ihr Problem zu lösen. Die Datei errno.c befindet sich im Ordner lib im Ordner apue. Kopieren Sie diese Datei in Ihr aktuelles Arbeitsverzeichnis. Dadurch wird Ihr Problem gelöst.
quelle