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에 따라 라이센스가 부여됩니다.