Compilando código de apue


12

Justo ahora comencé a leer el libro: Programación avanzada en el entorno UNIX® . Quería intentar ejecutar su primer ejemplo de código. Estoy ejecutando Scientific Linux 6.4.

Descargué el código fuente y, como dice en su makearchivo README, ejecuté el archivo sin comprimir.

Escribí el primer programa (un lscomando simulado )

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

y ponerlo en el archivo sin comprimir. Como había aconsejado el libro me encontré a continuación: gcc myls.c. Pero me sale este error:

# 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

Quería saber cómo puedo solucionar este problema. También quiero poder ejecutar un código que escribo en cualquier directorio.


¿De dónde esperas err_{quit,sys}venir?
Chris Down

En el código fuente sin comprimir, hay un directorio: includeque tiene el archivo de encabezado apue.h. Pero este es el único archivo en ese directorio. ¡No entiendo dónde están las definiciones de funciones reales! Pensé que alguien podría estar familiarizado con la estructura del archivo de código fuente de este libro aquí.
makhlaghi

Los .harchivos incluyen los prototipos para las funciones. Sus implementaciones están en .soo .aarchivos que deben estar presentes en la caja. Estas son bibliotecas dinámicas y estáticas que contienen las funciones.
slm

¿Qué es incluso apue.h?
voces

Respuestas:


13

Una breve revisión de cómo escribir y compilar los programas en Programación avanzada en el entorno UNIX® , gracias a slm por ayudarme a comprender los pasos. Puede descargar el código fuente desde aquí . Desearía que esta información se incluyera como parte del apéndice b del libro, donde se explica el archivo de encabezado.

El archivo descomprimido contiene directorios con los nombres de los capítulos y otros dos nombrados includey lib. Los que tienen los nombres de los capítulos tienen todos los programas de ese capítulo en ellos.

El includedirectorio contiene el archivo de cabecera que se utiliza en la mayoría de los programas en el libro: apue.h. El libdirectorio tiene el código fuente de las implementaciones para ese encabezado.

Supongamos que el archivo sin comprimir se encuentra en: SCADDRESS/por ejemplo, podría ser: /home/yourid/Downloads/apue.3e/

Una vez que descomprima el código fuente, vaya al directorio y ejecute make:

$ cd SCADDRESS
$ make

makecompilará todos los programas en todos los capítulos. Pero lo importante es que antes de eso, creará la biblioteca que contendrá las implementaciones de las funciones en apue.h.

Para compilar un programa de ejemplo que escriba en el libro, ejecute este comando GCC (suponiendo que el nombre de su programa myls.ces el primero en el libro):

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

-Ile dice a gccqué directorio buscar el archivo de inclusión. -Lle dice la ubicación del directorio de la biblioteca y -lapuele dice el nombre del archivo de la biblioteca que debe buscar en ese directorio. Tal que -LXXX significa buscar un archivo en el directorio de la biblioteca con el nombre: libXXX.a o libXXX.so.


A veces podría ser esclarecedor agregar -Wallal gcccomando para que advierta con más frecuencia.
MattBianco

3

Creo que esta pregunta y respuesta de stackoverflow titulada: ¿Dónde se define la función err_sys ()? tiene lo que necesitas 2 de las respuestas en ese hilo tenían esto que decir:

A1

err_sys () es una función utilizada en varios libros escritos por W. Richard Stevens. Esta función se utiliza para imprimir qué tipo de error ocurrió.

La función se utiliza en programas en los textos con un archivo de encabezado personalizado "ourhdr.h" (o algo más). Consulte el apéndice de la lista de encabezados o la definición de la función.

A2

La fuente de esta función (de Programación avanzada en el entorno UNIX®, por W. Richard Stevens) se puede encontrar en el sitio web del libro: http://www.apuebook.com/ .

Referencias


Gracias, pero mi problema es cómo compilarlo, por lo que estos errores no aparecen. El err_syses solo un ejemplo, hay otras funciones en ese archivo de encabezado. Por lo tanto, estoy buscando una respuesta genérica a este problema (cómo incluir el archivo de encabezado y compilarlo con éxito), no reescribir esta función en particular.
makhlaghi

1
@makhlaghi: los errores son b / c, te faltan las implementaciones subyacentes. Por lo general, incluye estos argumentos w / gccusing -Lque hacen referencia a las bibliotecas a utilizar. Las bibliotecas son los archivos .soo .a. Este tutorial podría ser útil para familiarizarse w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . Específicamente esta sección: "Búsqueda de archivos de encabezado y bibliotecas (-I, -L y -l)"
slm

Muchas gracias por su paciencia al tratar conmigo (¡ser inexperto!). Comprendí cómo compilarlo. Tengo que usar este comando: gcc -o myls myls.c -L LIBPOSITION -lapue. Donde LIBPOSITION está en el libdirectorio del directorio sin comprimir. Gracias de nuevo.
makhlaghi

@makhlaghi, no lo menciones. Me gusta ayudar a otros a entender cómo funcionan las cosas. Lo creas o no, tener que explicar las cosas me ayuda a comprender mejor las cosas también. ¡Gracias por la Q y buena suerte con tu viaje de gcc!
slm

2

Los siguientes pasos me han funcionado (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzDescargue el archivo tar comprimido con gzip del sitio oficial del libro
  2. tar xzf src.3e.tar.gzEsto crea la carpeta descomprimida llamada apue.3een el directorio actual de forma predeterminada
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Esto es para el enlace -lbsd en / hilos
  5. make Esto compilará automáticamente todo el código fuente en todas las carpetas
  6. cd introluego ./ls1 ..funciona como se esperaba (enumera los archivos del directorio principal)

Es posible que tenga que desplazarse para encontrar otros fragmentos de código del libro, pero debería ser sencillo.


1

Lo que me explicó makhlighi en su último comentario funcionó para mí, pero tuve que usar un código fuente diferente, no el del sitio web oficial www.apuebook.com.

El que utilicé se puede encontrar en https://github.com/roktas/apue2e . Como alguien explicó, este se ha implementado para trabajar con el sistema Linux moderno.


¿Quizás podrías elaborar esto un poco?
slm

0

He construido con éxito la biblioteca usando la instrucción de línea de comando dada aquí. He tenido dificultades para construir una muestra en Xcode. Para hacerlo, he definido las rutas de búsqueda para los archivos de encabezados y las bibliotecas (panel "Configuración de compilación"). De lo que he definido la biblioteca en sí en el panel "Fases de compilación" que en el panel "Enlace binario con bibliotecas". Después de eso, es una brisa.


0

Si apue.3e está instalado, puede intentar colocar apue en el directorio predeterminado del sistema operativo, por ejemplo:

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/

Cuando se compila el código, agregue el argumento: -lapue

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

0

'err_sys' y 'err_quit' están presentes en un archivo llamado 'errno.c' que no está en su directorio de trabajo actual. En primer lugar, abra la carpeta 'apue' que ha descargado y descomprimido y copie todos los elementos en esa carpeta, por ejemplo, advio, daemons, etc., todo en su directorio de trabajo actual. Puede conocer su directorio de trabajo actual al usando el comando 'pwd'. Ahora, en la carpeta 'incluir' encontrará el archivo de encabezado apue. Copie eso también en su directorio de trabajo actual. En pocas palabras, cualquier archivo .c que vaya a usar en su programa debe estar en su directorio de trabajo actual. Entonces, copie todos esos archivos a su directorio de trabajo actual.

Ahora, para resolver su problema. El archivo errno.c está en la carpeta lib en la carpeta apue. Copie eso en su directorio de trabajo actual. Eso resolverá su problema.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.