Liux 에서 'UNIX 환경 고급 프로 그래 밍' 을 실행 하 는 첫 번 째 프로그램 에서 원본 코드 컴 파일 오류 처리 방법
                                            
 4831 단어  linux 학습 노트UNIX 환경 고급 프로 그래 밍
                    
먼저 터미널 에 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
홈 디 렉 터 리 아래 내용 을 볼 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
2019 - 02 - 13 노트 - Nginx 기능 설정 (리 버스 에이전트, SSL)리 버스 프 록 시 (Reverse Proxy) 는 프 록 시 서버 로 퍼 블 릭 네트워크 의 연결 요청 을 받 은 후 내부 네트워크 에 있 는 서버 에 전송 요청 을 하고 서버 에서 얻 은 결 과 를 퍼 블 릭 네...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.