Liux 에서 'UNIX 환경 고급 프로 그래 밍' 을 실행 하 는 첫 번 째 프로그램 에서 원본 코드 컴 파일 오류 처리 방법

며칠 전에 '유 닉 스 환경 고급 프로 그래 밍' 이라는 책 을 사서 Liux 의 프로 그래 밍 을 잘 배우 고 싶 습 니 다.지정 한 디 렉 터 리 의 내용 을 보 여 주 는 첫 번 째 예 를 본 사람 은 셸 의 ls 내용 입 니 다. 코드 가 실 행 될 때 계속 문제 가 생 겼 습 니 다.나중에 인터넷 에서 많은 해결 방법 을 찾 았 는데 마침내 해결 되 었 다.방법 부터 붙 여.
먼저 터미널 에 vi ls. c 를 입력 하고 다음 코드 를 편집 합 니 다.
#include "apue.h"
#include            
int main(int argc, char *argv[])   
{   
        DIR                             *dp;   
        struct dirent   *dirp;   
        
        if (argc != 2)   
                err_quit("usage: ls directory_name"); //请输入文件名  
        
        if ((dp = opendir(argv[1])) == NULL)   
                err_sys("can't open %s", argv[1]);  //不能打开文件 
        while ((dirp = readdir(dp)) != NULL)   
                printf("%s
", dirp->d_name); closedir(dp); exit(0); } 
 

다시 저장 종료. 컴 파일 진행 gcc ls. c 와 같은 오류 가 발생 할 수 있 습 니 다.
ls.c:1:19: apue.h: No such file or directory ls.c: In function `main': ls.c:13: error: `NULL' undeclared (first use in this function) ls.c:13: error: (Each undeclared identifier is reported only once ls.c:13: error: for each function it appears in.)
해결 방법:
apue. h 는 프로그램 에 필요 한 상용 헤더 파일 과 오류 처리 함 수 를 포함 하여 작성 자가 정의 한 헤더 파일 이기 때 문 입 니 다.그래서 시스템 헤더 파일 에 넣 어야 하기 때 문 입 니 다. /usr/include), 이렇게 하면 gcc 컴 파일 러 가 그것 을 찾 을 수 있 습 니 다.그 러 니까 작가 님 한테 먼저 가서 웹 사 이 트 를 제공 하 세 요.http://www.apuebook.com/apue2e.html다음 Suorce 코드 에서 src. 2e. tar. gz 패키지, 그리고 컴퓨터 의 한 디 렉 터 리 에 압축 을 풀 었 습 니 다. 예 를 들 어 저 는/home/xxx (로그 인 이름)/아래 에 있 습 니 다. 그리고 압축 해제 디 렉 터 리 apue. 2e 에 들 어가 Make. defines. linux 의 WKDIR =/home/xxx/apue. 2e 를 수정 하여 WKDIR =/home/user/apue. 2e 입 니 다. 이것 이 바로 우리 가 make 할 작업 디 렉 터 리 입 니 다. 그리고 std 디 렉 터 리 에 들 어가 vi 로 linux. mk 를 엽 니 다.안에 있 는 nawk 를 모두 awk 로 변경 합 니 다.
시스템 기본 헤더 파일 디 렉 터 리 에 apue. h 를 복사 합 니 다. (이 디 렉 터 리 는/usr/include 입 니 다.)
우선 루트 사용자 로 바 꿔 야 합 니 다. 
그리고 apue. 2e/include 에 있 는 apue. h 를 복사 합 니 다. /usr/include 아래 명령 실행\# cp/home/xxx/apue. 2e/include/apue. h/usr/include
ls. c 파일 이 있 는 디 렉 터 리 실행 프로그램 으로 돌아 가기
다음 오류 가 발생 할 수 있 습 니 다: undefined reference to ` errquit' : undefined reference to `err_sys' 해결 방법: err 때문에quit 와 errsys 는 작성 자가 정의 한 오류 처리 함수 입 니 다. 헤더 파일 을 따로 정의 해 야 합 니 다./usr/include 에서 my err. h 라 는 파일 을 새로 만 듭 니 다.
내용
#include "apue.h"
#include       /* for definition of errno */
#include      /* 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, " ");
   fflush(stdout);     /* in case stdout and stderr are the same */
   fputs(buf, stderr);
   fflush(NULL);       /* flushes all stdio output streams */
}

다음은 ls. c 에서\# include 를 인용 하면 됩 니 다.
실행 중인 프로그램 gcc ls. c 
./a.out/home
홈 디 렉 터 리 아래 내용 을 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기