Compilazione del codice da apue


12

Proprio ora ho iniziato a leggere il libro: Advanced Programming in UNIX® Environment . Volevo provare a eseguire il suo primo esempio di codice. Sto eseguendo Scientific Linux 6.4.

Ho scaricato il codice sorgente e, come si dice nel suo README, ho eseguito makeil file non compresso.

Ho scritto il primo programma (un lscomando simulato )

#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;
}

e inseriscilo nel file non compresso. Come aveva consigliato il libro che poi corse: gcc myls.c. Ma ottengo questo errore:

# 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

Volevo sapere come posso risolvere questo problema. Voglio anche essere in grado di eseguire un codice che scrivo in qualsiasi directory.


Da dove ti aspetti err_{quit,sys}di venire?
Chris Down,

Nel codice sorgente non compresso, c'è una directory:, includeche ha il file header apue.h. Ma questo è l'unico file in quella directory. Non capisco dove siano le effettive definizioni delle funzioni! Ho pensato che qualcuno potesse avere familiarità con la struttura del file di codice sorgente di questo libro qui.
makhlaghi,

I .hfile includono i prototipi per le funzioni. Le loro implementazioni sono in .soo .afile che devono essere presenti sulla scatola. Queste sono librerie dinamiche e statiche che contengono le funzioni.
slm

Cos'è anche apue.h?
voci

Risposte:


13

Una breve rassegna di come scrivere e compilare i programmi in Advanced Programming in UNIX® Environment , grazie a slm per avermi aiutato a capire i passaggi. Puoi scaricare il codice sorgente da qui . Vorrei che queste informazioni fossero incluse come parte dell'appendice b del libro, in cui è spiegato il file di intestazione.

Il file non compresso contiene directory con i nomi dei capitoli e altri due nominati includee lib. Quelli con i nomi dei capitoli contengono tutti i programmi di quel capitolo.

La includedirectory contiene il file di intestazione che viene utilizzato nella maggior parte dei programmi del libro: apue.h. La libdirectory ha il codice sorgente delle implementazioni per quell'intestazione.

Supponiamo che il file non compresso si trovi in:, SCADDRESS/ad esempio potrebbe essere: /home/yourid/Downloads/apue.3e/

Dopo aver decompresso il codice sorgente, vai nella directory ed esegui make:

$ cd SCADDRESS
$ make

makecompilerà tutti i programmi in tutti i capitoli. Ma la cosa importante è che prima di ciò, creerà la libreria che conterrà le implementazioni delle funzioni apue.h.

Per compilare un programma di esempio che scrivi dal libro, esegui questo comando GCC (supponendo che il nome del tuo programma myls.csia il primo nel libro):

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

-Iindica gccquale directory cercare il file include. -Lindica la posizione della directory della libreria e -lapue, indica il nome del file della libreria da cercare in quella directory. Tale che -LXXX significa cercare un file nella directory della libreria con il nome: libXXX.a o libXXX.so.


A volte potrebbe essere illuminante aggiungere -Wallal gcccomando per farlo avvertire più spesso.
MattBianco,

3

Penso che questo Q&A StackOverflow intitolato: dove è definita la funzione err_sys ()? ha quello che ti serve. 2 delle risposte in quella discussione avevano questo da dire:

A1

err_sys () è una funzione usata in diversi libri scritti da W. Richard Stevens. Questa funzione viene utilizzata per stampare il tipo di errore che si è verificato.

La funzione è utilizzata nei programmi nei testi con un file di intestazione personalizzato "ourhdr.h" (o qualcos'altro). Controllare l'appendice per l'elenco di intestazioni o la definizione della funzione.

A2

La fonte di questa funzione (da Advanced Programming in UNIX® Environment, di W. Richard Stevens) è disponibile sul sito web del libro: http://www.apuebook.com/ .

Riferimenti


Grazie, ma il mio problema è come compilarlo, quindi questi errori non emergono. Questo err_sysè solo un esempio, ci sono altre funzioni in quel file di intestazione. Quindi sto cercando una risposta generica a questo problema (come includere il file header e compilarlo con successo), non riscrivere questa particolare funzione.
makhlaghi,

1
@makhlaghi - gli errori sono b / c ti mancano le implementazioni sottostanti. Di solito li includi gccusando -Largomenti che fanno riferimento alle librerie da usare. Le librerie sono i file .soo .a. Questo tutorial potrebbe essere utile per conoscere w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . In particolare questa sezione: "Ricerca di file e librerie di intestazione (-I, -L e -l)"
slm

Grazie mille per la tua pazienza nel trattare con me (essere inesperto!). Ho capito come compilarlo. Devo usare questo comando: gcc -o myls myls.c -L LIBPOSITION -lapue. Dove LIBPOSITION si trova nella libdirectory della directory non compressa. Grazie ancora.
makhlaghi,

@makhlaghi - non menzionarlo. Mi piace aiutare gli altri a capire come funzionano le cose. Che ci crediate o no, dovendo spiegare le cose mi aiuta anche a capire meglio le cose. Grazie per la Q e buona fortuna con il tuo viaggio gcc!
slm

2

I seguenti passaggi hanno funzionato per me (Ubuntu 14.04 64 bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzScarica l'archivio tar gzipped dal sito ufficiale del libro
  2. tar xzf src.3e.tar.gzCiò crea la cartella decompressa chiamata apue.3enella directory corrente per impostazione predefinita
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Questo è per il collegamento -lbsd in / thread
  5. make Questo compilerà automaticamente tutto il codice sorgente in tutte le cartelle
  6. cd introquindi ./ls1 ..funziona come previsto (elenca i file dalla directory principale)

Potrebbe essere necessario cercare in giro per trovare altri frammenti di codice nel libro, ma dovrebbe essere semplice.


1

Ciò che Makhlighi ha spiegato nel suo ultimo commento ha funzionato per me, ma ho dovuto utilizzare un codice sorgente diverso da quello del sito ufficiale www.apuebook.com.

Quello che ho usato può essere trovato in https://github.com/roktas/apue2e . Come qualcuno ha spiegato, questo è stato implementato per funzionare con il moderno sistema Linux.


Forse potresti elaborarlo un po '?
slm

0

Ho creato correttamente la libreria usando le istruzioni della riga di comando fornite qui. Ho avuto difficoltà a creare un campione in Xcode. Per farlo, ho definito i percorsi di ricerca per i file delle intestazioni e le librerie (riquadro "Impostazioni build"). Di quanto ho definito la libreria stessa nel riquadro "Crea fasi" rispetto a "Collega binario con librerie". Dopodiché, è un gioco da ragazzi.


0

Se è installato apue.3e , puoi provare a inserire apue nella directory predefinita del sistema operativo, ad esempio:

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/

Quando viene compilato il codice, aggiungere l'argomento: -lapue

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

0

'err_sys' e 'err_quit' sono presenti in un file chiamato 'errno.c' che non si trova nella directory di lavoro corrente. Prima di tutto, apri la cartella 'apue' che hai scaricato e decompresso e copia tutti gli elementi in quella cartella, ad esempio advio, daemon, ecc., Tutto nella tua directory di lavoro corrente. Puoi conoscere la tua directory di lavoro corrente tramite usando il comando 'pwd'.Ora, nella cartella' include 'troverai il file header apue.Copia anche quello nella tua attuale directory di lavoro. In breve, qualsiasi file .c che userai nel tuo programma deve essere nella directory di lavoro corrente, quindi copiare tutti quei file nella directory di lavoro corrente.

Ora, per risolvere il tuo problema. Il file errno.c si trova nella cartella lib nella cartella apue. Copialo nella tua directory di lavoro corrente per risolvere il tuo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.