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 make
archivo README, ejecuté el archivo sin comprimir.
Escribí el primer programa (un ls
comando 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.
err_{quit,sys}
venir?include
que tiene el archivo de encabezadoapue.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í..h
archivos incluyen los prototipos para las funciones. Sus implementaciones están en.so
o.a
archivos que deben estar presentes en la caja. Estas son bibliotecas dinámicas y estáticas que contienen las funciones.apue.h
?Respuestas:
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
include
ylib
. Los que tienen los nombres de los capítulos tienen todos los programas de ese capítulo en ellos.El
include
directorio contiene el archivo de cabecera que se utiliza en la mayoría de los programas en el libro:apue.h
. Ellib
directorio 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
:make
compilará 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 enapue.h
.Para compilar un programa de ejemplo que escriba en el libro, ejecute este comando GCC (suponiendo que el nombre de su programa
myls.c
es el primero en el libro):-I
le dice agcc
qué directorio buscar el archivo de inclusión.-L
le dice la ubicación del directorio de la biblioteca y-lapue
le 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.fuente
-Wall
algcc
comando para que advierta con más frecuencia.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
A2
Referencias
fuente
err_sys
es 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.gcc
using-L
que hacen referencia a las bibliotecas a utilizar. Las bibliotecas son los archivos.so
o.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)"gcc -o myls myls.c -L LIBPOSITION -lapue
. Donde LIBPOSITION está en ellib
directorio del directorio sin comprimir. Gracias de nuevo.Los siguientes pasos me han funcionado (Ubuntu 14.04 64bit):
wget http://www.apuebook.com/src.3e.tar.gz
Descargue el archivo tar comprimido con gzip del sitio oficial del librotar xzf src.3e.tar.gz
Esto crea la carpeta descomprimida llamadaapue.3e
en el directorio actual de forma predeterminadacd apue.3e
sudo apt-get install libbsd-dev
. Esto es para el enlace -lbsd en / hilosmake
Esto compilará automáticamente todo el código fuente en todas las carpetascd intro
luego./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.
fuente
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.
fuente
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.
fuente
Si apue.3e está instalado, puede intentar colocar apue en el directorio predeterminado del sistema operativo, por ejemplo:
Cuando se compila el código, agregue el argumento:
-lapue
fuente
'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.
fuente