undefined reference to `err_quit' ; undefined reference to `err_sys’是啥错误?

# include "apue.h"
# include <dirent.h>

int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;

if(argc != 2)
err_quit("usage : Is 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);
exit(0);
}
在用命令cc myls.c编译时出现
/tmp/ccePmLbz.o: In function `main':
myls.c:(.text+0x20): undefined reference to `err_quit'
myls.c:(.text+0x55): undefined reference to `err_sys'
collect2: ld 返回 1
这样的错误,是怎么回事,应该怎么修改?

我跟你遇到的是同样的问题,你这个满意答案一点都不具体,下面是我的解决办法:
1、在编辑myls.c文件时加入#include“apueerror.h”
apueerror.h代码如下(复制粘贴后改为.h后缀的文件)
#include "apue.h"
#include <errno.h> /* for definition of errno */
#include <stdarg.h> /* ISO C variable aruments */

static void err_doit(int, int, const char *, va_list);
/*
* Nonfatal error related to a system call.
* Print a message and return.
*/
void
err_ret(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
}

/*
* Fatal error related to a system call.
* Print a message and terminate.
*/
void
err_sys(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
exit(1);
}

/*
* Fatal error unrelated to a system call.
* Error code passed as explict parameter.
* Print a message and terminate.
*/
void
err_exit(int error, const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, error, fmt, ap);
va_end(ap);
exit(1);
}

/*
* Fatal error related to a system call.
* Print a message, dump core, and terminate.
*/
void
err_dump(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
abort(); /* dump core and terminate */
exit(1); /* shouldn't get here */
}

/*
* Nonfatal error unrelated to a system call.
* Print a message and return.
*/
void
err_msg(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
}

/*
* Fatal error unrelated to a system call.
* Print a message and terminate.
*/
void
err_quit(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
exit(1);
}

/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
strerror(error));
strcat(buf, "\n");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(NULL); /* flushes all stdio output streams */
}

2、看到apueerror.h文件里面包含了
#include <errno.h>
#include <stdarg.h>
这2个头文件是吧
然后再把这2个头文件添加到同一个目录下,具体代码如下:
errno.h

#ifndef _I386_ERRNO_H   
#define _I386_ERRNO_H   
#define EPERM 1 /* Operation not permitted */   
#define ENOENT 2 /* No such file or directory */   
#define ESRCH 3 /* No such process */   
#define EINTR 4 /* Interrupted system call */   
#define EIO 5 /* I/O error */   
#define ENXIO 6 /* No such device or address */   
#define E2BIG 7 /* Arg list too long */   
#define ENOEXEC 8 /* Exec format error */   
#define EBADF 9 /* Bad file number */   
#define ECHILD 10 /* No child processes */   
#define EAGAIN 11 /* Try again */   
#define ENOMEM 12 /* Out of memory */   
#define EACCES 13 /* Permission denied */   
#define EFAULT 14 /* Bad address */   
#define ENOTBLK 15 /* Block device required */   
#define EBUSY 16 /* Device or resource busy */   
#define EEXIST 17 /* File exists */   
#define EXDEV 18 /* Cross-device link */   
#define ENODEV 19 /* No such device */   
#define ENOTDIR 20 /* Not a directory */   
#define EISDIR 21 /* Is a directory */   
#define EINVAL 22 /* Invalid argument */   
#define ENFILE 23 /* File table overflow */   
#define EMFILE 24 /* Too many open files */   
#define ENOTTY 25 /* Not a typewriter */   
#define ETXTBSY 26 /* Text file busy */   
#define EFBIG 27 /* File too large */   
#define ENOSPC 28 /* No space left on device */   
#define ESPIPE 29 /* Illegal seek */   
#define EROFS 30 /* Read-only file system */   
#define EMLINK 31 /* Too many links */   
#define EPIPE 32 /* Broken pipe */   
#define EDOM 33 /* Math argument out of domain of func */   
#define ERANGE 34 /* Math result not representable */   
#define EDEADLK 35 /* Resource deadlock would occur */   
#define ENAMETOOLONG 36 /* File name too long */   
#define ENOLCK 37 /* No record locks available */   
#define ENOSYS 38 /* Function not implemented */   
#define ENOTEMPTY 39 /* Directory not empty */   
#define ELOOP 40 /* Too many symbolic links encountered */   
#define EWOULDBLOCK EAGAIN /* Operation would block */   
#define ENOMSG 42 /* No message of desired type */   
#define EIDRM 43 /* Identifier removed */   
#define ECHRNG 44 /* Channel number out of range */   
#define EL2NSYNC 45 /* Level 2 not synchronized */   
#define EL3HLT 46 /* Level 3 halted */   
#define EL3RST 47 /* Level 3 reset */   
#define ELNRNG 48 /* Link number out of range */   
#define EUNATCH 49 /* Protocol driver not attached */   
#define ENOCSI 50 /* No CSI structure available */   
#define EL2HLT 51 /* Level 2 halted */   
#define EBADE 52 /* Invalid exchange */   
#define EBADR 53 /* Invalid request descriptor */   
#define EXFULL 54 /* Exchange full */   
#define ENOANO 55 /* No anode */   
#define EBADRQC 56 /* Invalid request code */   
#define EBADSLT 57 /* Invalid slot */   
#define EDEADLOCK EDEADLK   
#define EBFONT 59 /* Bad font file format */   
#define ENOSTR 60 /* Device not a stream */   
#define ENODATA 61 /* No data available */   
#define ETIME 62 /* Timer expired */   
#define ENOSR 63 /* Out of streams resources */   
#define ENONET 64 /* Machine is not on the network */   
#define ENOPKG 65 /* Package not installed */   
#define EREMOTE 66 /* Object is remote */   
#define ENOLINK 67 /* Link has been severed */   
#define EADV 68 /* Advertise error */   
#define ESRMNT 69 /* Srmount error */   
#define ECOMM 70 /* Communication error on send */   
#define EPROTO 71 /* Protocol error */   
#define EMULTIHOP 72 /* Multihop attempted */   
#define EDOTDOT 73 /* RFS specific error */   
#define EBADMSG 74 /* Not a data message */   
#define EOVERFLOW 75 /* Value too large for defined data type */   
#define ENOTUNIQ 76 /* Name not unique on network */   
#define EBADFD 77 /* File descriptor in bad state */   
#define EREMCHG 78 /* Remote address changed */   
#define ELIBACC 79 /* Can not access a needed shared library */   
#define ELIBBAD 80 /* Accessing a corrupted shared library */   
#define ELIBSCN 81 /* .lib section in a.out corrupted */   
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */   
#define ELIBEXEC 83 /* Cannot exec a shared library directly */   
#define EILSEQ 84 /* Illegal byte sequence */   
#define ERESTART 85 /* Interrupted system call should be restarted */   
#define ESTRPIPE 86 /* Streams pipe error */   
#define EUSERS 87 /* Too many users */   
#define ENOTSOCK 88 /* Socket operation on non-socket */   
#define EDESTADDRREQ 89 /* Destination address required */   
#define EMSGSIZE 90 /* Message too long */   
#define EPROTOTYPE 91 /* Protocol wrong type for socket */   
#define ENOPROTOOPT 92 /* Protocol not available */   
#define EPROTONOSUPPORT 93 /* Protocol not supported */   
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */   
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */   
#define EPFNOSUPPORT 96 /* Protocol family not supported */   
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */   
#define EADDRINUSE 98 /* Address already in use */   
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */   
#define ENETDOWN 100 /* Network is down */   
#define ENETUNREACH 101 /* Network is unreachable */   
#define ENETRESET 102 /* Network dropped connection because of reset */   
#define ECONNABORTED 103 /* Software caused connection abort */   
#define ECONNRESET 104 /* Connection reset by peer */   
#define ENOBUFS 105 /* No buffer space available */   
#define EISCONN 106 /* Transport endpoint is already connected */   
#define ENOTCONN 107 /* Transport endpoint is not connected */   
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */   
#define ETOOMANYREFS 109 /* Too many references: cannot splice */   
#define ETIMEDOUT 110 /* Connection timed out */   
#define ECONNREFUSED 111 /* Connection refused */   
#define EHOSTDOWN 112 /* Host is down */   
#define EHOSTUNREACH 113 /* No route to host */   
#define EALREADY 114 /* Operation already in progress */   
#define EINPROGRESS 115 /* Operation now in progress */   
#define ESTALE 116 /* Stale NFS file handle */   
#define EUCLEAN 117 /* Structure needs cleaning */   
#define ENOTNAM 118 /* Not a XENIX named type file */   
#define ENAVAIL 119 /* No XENIX semaphores available */   
#define EISNAM 120 /* Is a named type file */   
#define EREMOTEIO 121 /* Remote I/O error */   
#define EDQUOT 122 /* Quota exceeded */   
#define ENOMEDIUM 123 /* No medium found */   
#define EMEDIUMTYPE 124 /* Wrong medium type */   
#end

stdarg.h

#ifndef _STDARG_H_
#define _STDARG_H_
#ifndef RC_INVOKED
#ifndef _VA_LIST_DEFINED
#define _VA_LIST_DEFINED
#endif
#ifndef _VA_LIST
#define _VA_LIST
typedef char* va_list;
#endif
#define __va_argsiz(t)
#ifdef __GNUC__
#define va_start(ap, pN)
#else
#define va_start(ap, pN)
#endif
#define va_end(ap) ((void)0)
#define va_arg(ap, t)
#endif
#endif

3、最后工作目录里有下面这几个文件就完全没有问题了!
myls.c
apue.h
apueerror.h
errno.h
stdarg.h
dirent.h

搞定收工(dirent.h文件应该有吧,没有照上述方法自己做一个或者网上载个都很方便)
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-02-14
void err_sys(const char *, ... );
这样只是声明了一下,没有对其定义,当然会报错,这个就相当于printf()的函数,只是它自己定义了一个新的,你去stdio.h头文件里看看printf()怎么定义的。
追问

没有找到printf()的定义,我也只是看到了一个声明。

本回答被提问者采纳
第2个回答  2012-09-25
这个是大神自己编写的一个报错函数、你在书的附录中可以看到该函数的定义……
第3个回答  2012-09-24
缺少对err_sys和err_quit的定义,去详细看看unix环境高级编程里的附录B
第4个回答  2011-08-31
rqrqrwq

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网