Właśnie zacząłem czytać książkę: Programowanie zaawansowane w środowisku UNIX® . Chciałem spróbować uruchomić pierwszy przykład kodu. Używam Scientific Linux 6.4.
Pobrałem kod źródłowy i jak mówi w swoim README, wpadłem make
w pliku nieskompresowanego.
Napisałem pierwszy program (próbne ls
polecenie)
#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;
}
i umieść go w nieskompresowanym pliku. Ponieważ książka poradził mi potem pobiegł: gcc myls.c
. Ale pojawia się ten błąd:
# 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
Chciałem wiedzieć, jak mogę rozwiązać ten problem. Chcę też móc uruchomić kod, który piszę w dowolnym katalogu.
include
zawierający plik nagłówka apue.h
. Ale to jest jedyny plik w tym katalogu. Nie rozumiem, gdzie są rzeczywiste definicje funkcji! Myślałem, że ktoś może tutaj znać strukturę pliku kodu źródłowego tej książki.
.h
pliki zawierają protypes dla funkcji. Ich implementacje są w .so
lub .a
pliki, które muszą być obecne na pudełku. Są to biblioteki dynamiczne i statyczne, które zawierają funkcje.
apue.h
?
err_{quit,sys}
się pochodzić?