Compiler du code depuis apue


12

Je viens de commencer la lecture du livre: Programmation avancée dans l'environnement UNIX® . Je voulais essayer d'exécuter son premier exemple de code. J'utilise Scientific Linux 6.4.

J'ai téléchargé le code source et comme il est dit dans son README, j'ai couru makedans le fichier non compressé.

J'ai écrit le premier programme (une fausse lscommande)

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

et le mettre dans le fichier non compressé. Comme le livre que j'avais conseillé alors couru: gcc myls.c. Mais je reçois cette erreur:

# 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

Je voulais savoir comment résoudre ce problème. Je veux également pouvoir exécuter un code que j'écris dans n'importe quel répertoire.


D'où vous attendez-vous err_{quit,sys}?
Chris Down

Dans le code source non compressé, il existe un répertoire:, includequi contient le fichier d'en-tête apue.h. Mais c'est le seul fichier de ce répertoire. Je ne comprends pas où sont les définitions de fonction réelles! Je pensais que quelqu'un connaissait peut-être la structure des fichiers de code source de ce livre ici.
makhlaghi

Les .hfichiers incluent les protypes des fonctions. Leurs implémentations sont dans .soou des .afichiers qui doivent être présents sur la boîte. Ce sont des bibliothèques dynamiques et statiques qui contiennent les fonctions.
slm

Qu'est-ce que c'est apue.h?
voix

Réponses:


13

Un bref examen de la façon d'écrire et de compiler les programmes en programmation avancée dans l'environnement UNIX® , grâce à slm pour m'avoir aidé à comprendre les étapes. Vous pouvez télécharger le code source ici . Je souhaite que ces informations soient incluses dans le cadre de l'annexe B du livre, où le fichier d'en-tête est expliqué.

Le fichier non compressé contient des répertoires avec les noms des chapitres et deux autres nommés includeet lib. Ceux avec les noms des chapitres ont tous les programmes de ce chapitre en eux.

Le includerépertoire contient le fichier d' en- tête qui est utilisé dans la plupart des programmes dans le livre: apue.h. Le librépertoire contient le code source des implémentations de cet en-tête.

Supposons que le fichier non compressé se trouve à:, SCADDRESS/par exemple, il pourrait être: /home/yourid/Downloads/apue.3e/

Une fois que vous avez décompressé le code source, allez dans le répertoire et exécutez make:

$ cd SCADDRESS
$ make

makecompilera tous les programmes dans tous les chapitres. Mais l'important est qu'avant cela, il créera la bibliothèque qui contiendra les implémentations des fonctions dans apue.h.

Pour compiler un exemple de programme que vous écrivez à partir du livre, exécutez cette commande GCC (en supposant que le nom de votre programme myls.cest le premier du livre):

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

-Iindique gccquel répertoire rechercher le fichier include. -Llui indique l'emplacement du répertoire de la bibliothèque et -lapueindique le nom du fichier de bibliothèque à rechercher dans ce répertoire. Telle que -LXXX signifie rechercher un fichier dans le répertoire de la bibliothèque avec le nom: libXXX.a ou libXXX.so.


Il peut parfois être instructif d'ajouter -Wallà la gcccommande pour l'avertir plus souvent.
MattBianco

3

Je pense que ce Q&A stackoverflow intitulé: Où est définie la fonction err_sys ()? a ce dont vous avez besoin. 2 des réponses dans ce fil avaient ceci à dire:

A1

err_sys () est une fonction utilisée dans plusieurs livres écrits par W. Richard Stevens. Cette fonction est utilisée pour imprimer le type d'erreur survenu.

La fonction est utilisée dans les programmes dans les textes avec un fichier d'en-tête personnalisé "ourhdr.h" (ou autre chose). Consultez l'annexe pour la liste des en-têtes ou la définition de la fonction.

A2

La source de cette fonction (de Advanced Programming in the UNIX® Environment, par W. Richard Stevens) peut être trouvée sur le site Web du livre: http://www.apuebook.com/ .

Les références


Merci, mais mon problème est de savoir comment le compiler, afin que ces erreurs ne se produisent pas. Ce err_sysn'est qu'un exemple, il y a d'autres fonctions dans ce fichier d'en-tête. Je cherche donc une réponse générique à ce problème (comment inclure le fichier d'en-tête et le compiler avec succès), sans réécrire cette fonction particulière.
makhlaghi

1
@makhlaghi - les erreurs sont b / c vous manquez les implémentations sous-jacentes. Vous incluez généralement ces w / en gccutilisant des -Larguments référençant les bibliothèques à utiliser. Les bibliothèques sont les fichiers .soou .a. Ce didacticiel peut être utile pour vous familiariser avec w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . Plus précisément, cette section: "Recherche de fichiers d'en-tête et de bibliothèques (-I, -L et -l)"
slm

Merci beaucoup pour votre patience avec moi (sans expérience!). J'ai compris comment le compiler. Je dois utiliser cette commande: gcc -o myls myls.c -L LIBPOSITION -lapue. Où LIBPOSITION se trouve dans le librépertoire du répertoire non compressé. Merci encore.
makhlaghi

@makhlaghi - ne le mentionnez pas. J'aime aider les autres à comprendre comment les choses fonctionnent. Croyez-le ou non, en ayant à expliquer les choses, cela m'aide aussi à mieux comprendre les choses. Merci pour le Q et bonne chance avec votre voyage gcc!
slm

2

Les étapes suivantes ont fonctionné pour moi (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzTéléchargez l'archive tar gzippée depuis le site officiel du livre
  2. tar xzf src.3e.tar.gzCela crée le dossier décompressé appelé apue.3esous le répertoire actuel par défaut
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. C'est pour le lien -lbsd dans / threads
  5. make Cela compilera automatiquement tout le code source dans tous les dossiers
  6. cd intro./ls1 ..fonctionne ensuite comme prévu (répertorie les fichiers du répertoire parent)

Vous devrez peut-être chercher pour trouver d'autres extraits de code dans le livre, mais cela devrait être simple.


1

Ce que makhlighi a expliqué dans son dernier commentaire a fonctionné pour moi, mais j'ai dû utiliser un code source différent de celui du site officiel www.apuebook.com.

Celui que j'ai utilisé se trouve dans https://github.com/roktas/apue2e . Comme quelqu'un l'a expliqué, celui-ci a été implémenté pour fonctionner avec un système Linux moderne.


Peut-être pourriez-vous développer cela un peu?
slm

0

J'ai réussi à créer la bibliothèque en utilisant l'instruction de ligne de commande donnée ici. J'ai eu des difficultés à construire un échantillon dans Xcode. Pour ce faire, j'ai défini les chemins de recherche des fichiers d'en-têtes et des bibliothèques (volet "Build Settings"). Que j'ai défini la bibliothèque elle-même dans le volet "Build Phases" que "Link Binary With Libraries". Après ça, c'est un jeu d'enfant.


0

Si apue.3e est installé, vous pouvez essayer de mettre apue dans le répertoire par défaut du système d'exploitation, par exemple:

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/

Lorsque le code est compilé, veuillez ajouter l'argument: -lapue

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

0

'err_sys' et 'err_quit' sont présents dans un fichier appelé 'errno.c' qui n'est pas dans votre répertoire de travail actuel. Tout d'abord, ouvrez le dossier 'apue' que vous avez téléchargé et décompressé et copiez tous les éléments de ce dossier, par exemple, advio, démons, etc., tout dans votre répertoire de travail actuel. Vous pouvez connaître votre répertoire de travail actuel en en utilisant la commande 'pwd'.Maintenant, dans le dossier' include 'vous trouverez le fichier d'en-tête apue.Copiez-le aussi dans votre répertoire de travail actuel.En un mot, tout fichier .c que vous allez utiliser dans votre programme doit être dans votre répertoire de travail actuel. Copiez donc tous ces fichiers dans votre répertoire de travail actuel.

Maintenant, pour résoudre votre problème. Le fichier errno.c se trouve dans le dossier lib du dossier apue. Copiez-le dans votre répertoire de travail actuel. Cela résoudra votre problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.