On Sun, May 25, 2008 at 10:41:38PM -0400, deoxy wrote:
> I dont know if this a cuestion for this list, but I think is it a
> valid cuestion...  I reading a book recomended in
> http://www.openbsd.org/books.html The book is "Advanced programmig in
> the unix environment".  In this book I read Figure 3.1 but this not
> compile. the error is:
> 
> $cc F3_10.c
> /tmp//ccnsuA79.o(.text+027): In function 'main':
> :undefined reference to 'err_quit'
> /tmp//ccnsuA79.o(.text+0x74): In fuction 'main':
> :undefined reference to 'err_sys'
> /tmp//ccnsuA79.o(.txt+0xdf): In functiion 'main':
> :undefined reference to 'err_dump'
> collect2: ld returned 1 exit status
> 
> The source is:
> 
> 
> #include "apue.h"
> #include <fcntl.h>
> 
> int
> main(int argc, char *argv[])
> {
>       int val;
>       if (argc != 2)
>         err_quit("usage: a.out <descriptor#>");
>       if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
>         err_sys("fcntl error for fd %d", atoi(argv[1]));
> 
>       switch (val & O_ACCMODE) {
>       case O_RDONLY:
>               printf("read only");
>               break;
>       case O_WRONLY:
>               printf("write only");
>               break;
>       case O_RDWR:
>               printf("read write");
>               break;
>       default:
>               err_dump("unknown access mode");
>       }
>       if (val & O_APPEND)
>               printf(", append");
>       if (val & O_NONBLOCK)
>               printf(", nonblocking");
>       #if  defined(O_SYNC)
>               if (val & O_SYNC)
>                       printf(", synchronous writes");
>       #endif
>               putchar('\n');
>               exit(0);
>       }

The problem is that the author's custom error functions -- err_quit,
err_sys, etc. -- have not been defined anywhere in your program (nor are
they prototyped in apue.h, and unfortunately he isn't really clear about
this fact).  See Appendix B.2 for some example definitions...  you'll
probably want to put these in a separate C file for easy reuse.

For example, suppose the contents of Figure B.3 in Appendix B.2 ("Error
functions that output to standard error") have been written to the file
error.c, in the same directory as apue.h and a file fig03-10.c
containing the source code from Figure 3.10.  Then to compile program
3.10 successfully, you could do:

    $ cc fig03-10.c error.c

-- 
Mark Shroyer
http://markshroyer.com/contact/

Reply via email to