Kompilieren von Code aus apue

12

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- makeDatei 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.

makhlaghi
quelle
Woher erwarten Sie err_{quit,sys}zu kommen?
Chris Down
Im unkomprimierten Quellcode gibt es ein Verzeichnis: includemit der Header-Datei apue.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.
Makhlaghi
Die .hDateien enthalten die Prototypen für die Funktionen. Ihre Implementierungen sind in .sooder .aDateien, die auf der Box vorhanden sein müssen. Dies sind dynamische und statische Bibliotheken, die die Funktionen enthalten.
slm
Was ist das überhaupt apue.h?
Stimmen

Antworten:

13

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 includeund lib. Diejenigen mit den Namen der Kapitel enthalten alle Programme dieses Kapitels.

Das includeVerzeichnis enthält die Header - Datei , die in den meisten der Programme in dem Buch verwendet wird: apue.h. Das libVerzeichnis 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:

$ cd SCADDRESS
$ make

makeKompiliert alle Programme in allen Kapiteln. Wichtig ist jedoch, dass vorher die Bibliothek erstellt wird, die die Implementierungen der Funktionen in enthält apue.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.cist der erste im Buch):

gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue

-IGibt an, in gccwelchem ​​Verzeichnis nach der Include-Datei gesucht werden soll. -Lgibt den Speicherort des Bibliotheksverzeichnisses und -lapueden 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.

makhlaghi
quelle
Es kann manchmal aufschlussreich sein, -Wallden gccBefehl zu ergänzen , um ihn häufiger warnen zu lassen.
MattBianco
3

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

err_sys () ist eine Funktion, die in mehreren Büchern von W. Richard Stevens verwendet wird. Mit dieser Funktion wird gedruckt, welche Art von Fehler aufgetreten ist.

Die Funktion wird in Programmen in den Texten mit einer benutzerdefinierten Header-Datei "ourhdr.h" (oder etwas anderem) verwendet. Überprüfen Sie den Anhang für die Header-Auflistung oder die Funktionsdefinition.

A2

Die Quelle für diese Funktion (aus Advanced Programming in the UNIX® Environment, von W. Richard Stevens) finden Sie auf der Website des Buches: http://www.apuebook.com/ .

Verweise

slm
quelle
Danke, aber mein Problem ist, wie man es kompiliert, damit diese Fehler nicht auftauchen. Dies err_sysist 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.
Makhlaghi
1
@makhlaghi - die Fehler sind b / c Sie vermissen die zugrunde liegenden Implementierungen. Sie enthalten in der Regel diese w / gccmit -LArgumenten Referenzierung der Bibliotheken zu verwenden. Die Bibliotheken sind die .sooder .aDateien. 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 und
-Bibliotheken
Vielen Dank für Ihre Geduld im Umgang mit mir (unerfahren!). Ich verstand es zu kompilieren. Ich habe diesen Befehl verwenden: gcc -o myls myls.c -L LIBPOSITION -lapue. Wobei sich LIBPOSITION im libVerzeichnis des nicht komprimierten Verzeichnisses befindet. Danke noch einmal.
Makhlaghi
@makhlaghi - erwähne es nicht. Ich helfe gerne anderen zu verstehen, wie die Dinge funktionieren. Ob Sie es glauben oder nicht, wenn Sie Dinge erklären müssen, hilft es mir, die Dinge auch besser zu verstehen. Vielen Dank für das Q und viel Glück w / you gcc Reise!
slm
2

Die folgenden Schritte haben bei mir funktioniert (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzLaden Sie das gzipped tar-Archiv von der offiziellen Buchseite herunter
  2. tar xzf src.3e.tar.gzDadurch wird der entpackte Ordner erstellt, der standardmäßig apue.3eunter dem aktuellen Verzeichnis aufgerufen wird
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Dies ist für den Link -lbsd in / threads
  5. make Dadurch wird automatisch der gesamte Quellcode in allen Ordnern kompiliert
  6. cd 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.

Yibo Yang
quelle
1

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.

Bilal Korir
quelle
Vielleicht könnten Sie das etwas näher erläutern?
SLM
0

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.

Thierry Jeanneret
quelle
0

Wenn apue.3e installiert ist, können Sie versuchen, apue in das Standardverzeichnis zu kopieren. Beispiel:

code@lab:~/src/code$ sudo cp ../apue.3e/include/apue.h /usr/include/
code@lab:~/src/code$ sudo cp ../apue.3e/lib/libapue.a /usr/lib/

Wenn der Code kompiliert ist, fügen Sie bitte das Argument hinzu: -lapue

code@lab:~/src/code$ gcc -o myls myls.c -lapue
code@lab:~/src/code$ ./myls
Usage: ls <dir>
debuggen
quelle
0

'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.

Shanif Ansari
quelle