[make] 에러의 원인을 잘 모르겠습니다.
글쓴이: ssif / 작성시간: 일, 2005/06/12 - 7:06오후
make 를 하면 다음과 같은 에러가 발생합니다.
Quote:
[]# make
cc -Wall -c main.c
cc -Wall -c serial.c
serial.c: In function `serial':
serial.c:21: warning: implicit declaration of function `perror'
serial.c:21: warning: implicit declaration of function `exit'
serial.c:43: warning: implicit declaration of function `printf'
cc -Wall -c string_data.c
string_data.c: In function `check_login':
string_data.c:31: warning: implicit declaration of function `printf'
string_data.c: In function `send2client':
string_data.c:57: warning: implicit declaration of function `send'
cc -Wall -o main main.o serial.o string_data.o
Makefile의 내용은 다음과 같습니다.
OBJS = main.o serial.o string_data.o all : main main : $(OBJS) $(CC) -Wall -o $@ $(OBJS) main.o :main.c serial.h string_data.h string_data.o : string_data.c string_data.h serial.o : serial.c serial.h .c.o : $(CC) -Wall -c $< clean : rm -f main *.o
존재하는 파일은 main.c serial.c serial.h string_data.c string_data.h 입니다.
wiki.kldp.org의 make문서를 보았고 JOINC의 make문서도 보았습니다.
main.c에 포함된 해더파일은
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "serial.h" #include "string_data.h"
입니다.그리고 serial.h 에 포함된 해더 파일은
#ifndef __SERIAL_H__ #define __SERIAL_H__ #include <termios.h> #include <fcntl.h> #include <signal.h> #include <sys/types.h> #include <unistd.h>
입니다.serial.c 에 포함 된 해더 파일은 "serial.h"하나 뿐 입니다.
string_data.h에 포함된 해더파일은
#ifndef __STRING_DATA_H__ #define __STRING_DATA_H__ #include <string.h>
입니다.
어느 부분이 잘못되어 이런 애러를 출력하는지 잘 모르겠습니다.
미리 감사드립니다.[/code]
Forums:
Re: [make] 에러의 원인을 잘 모르겠습니다.
에러는 업는데여
경고만 있을뿐
함수 정의에 문제가 있다고 하는데..
즐린
warning: implicit declaration of functio
warning: implicit declaration of function
이건 선언에 안되어 있다는 경고이고, 이럴 경우 c 컴파일러 일경우는 스스로 가정을 해버립니다.
선언이 안되있는건 c++ 에서는 에러이지만 C에서는 경고 이지요.
이건 include 를 안하면 나오는 에러입니다.
가령 serial.c 에서 printf 를 사용하셨는데 printf 는 stdio.h 에 선언되어 있습니다. 하지만 serial.c 에 stdio.h 를 include 안하셨네요
[quote="ssehoony"]warning: implicit decl
설명 감사합니다.하지만 제가 원했던것은 중복 #include 을 회피하고자 함이었습니다. 이미 main.c 에 include를 했는데 다시 include 를 한다는것은 좀 이상해 보여서 입니다.제가 의도하는 대로 우너하는 결과를 얻기위해서는 어떤 문서를 참조하면 좋겠습니까?
어찌보면 make와 관계없이 다른곳에서 잘못을 범하는것 같아 다시 질문드립니다. 전웅님의 'c언어 펜더멘탈'을 다시 보고 있는데도 이해가 가지 않습니다.
처음 제 질문이 잘못되었기 때문인것 같습니다.이점 사과드립니다.
덧:"질문하는 법"문서를 3~4달에 한번씩 보는데도 여전히 질문이 서툴러러 hys545님께 사과드립니다.
봄들판에서다
[quote="ssif"]설명 감사합니다.하지만 제가 원했던것은 중복
헤더 파일이 아닌 서로 다른 소스 파일에서 동일한 헤더 파일을 include하는 것은 중복 include가 아닙니다.
오히려, 겪으셨던 경고나 혹은 다른 오류를 피하기 위해서는 동일한 헤더 파일이라도 include해 주어야 합니다. :-)
물론, 해당 소스 파일에서 필요로 하지 않는다면 include하지 않아야 하겠습니다면, 필요로 하는 헤더 파일은 동일한 헤더 파일이라고 하더라도 각 소스 파일에서 include 해 주는 게 맞습니다.
만일, 이 파일 저 파일 등등 여러 소스 파일에서 동일 헤더 파일에 대한 include 문이 여러 줄 생기고 이 때문에 관리상의 이유나 혹은 다른 이유로 부담이 되기 때문이라고 한다면, 각 소스에서 공통으로 include하는 임의의 헤더 파일을 작성하고, 해당 헤더 파일에서 include를 처리하는 방법도 있습니다.
이렇게 하면 각 소스에서는 하나의 헤더 파일만 include 해도 되겠지요.
--- 추가 ---
그러나 이 방법은 잘못하면 오히려 독이 됩니다.
쓸데 없는 헤더를 include 할 수 있고, 그때문에 컴파일 시간도 더 오래 걸리게되고, 서로 include 되어서는 안 되는 헤더 파일이 있는 경우에도 골치아파지고 등등...
잘 쓰면 좋지만요......
[quote="ssif"][quote="ssehoony"]warning:
main.c 에 stdio.h 를 인클루드 해줬다 하더라도
serial.c 에 다시 stdio.h를 인클루드 해줘야 합니다.
중복 include랑은 관계가 없습니다.
쉽게 설명해서
main.o 를 만들때 printf 의 함수원형에 대한 정보를 알고 있어야 하고,
이와는 완전히 독립적으로
serial.o 를 만들때 printf의 함수원형에 대한 정보를 알고 있어야 하기 때문입니다.
혹시나 잘못 알고 계실까봐 드리는 말씀이지만
include 해 준다고 printf 의 코드가 두 오브젝트 파일에 포함되는 그런 일은 없습니다.
단지 함수원형만 알려준다고 생각하시면 가장 편하실껍니다.
수정) 아.. 제출 눌러 보니 이미 윗분이 답글을..;
http://home.postech.ac.kr/~sodomau
Re: [make] 에러의 원인을 잘 모르겠습니다.
흔히 말하는 중복 include 는 헤더 가드가 되어있으면 방지됩니다.
serial.h 에서 하신 것 처럼
와 같이 헤더를 작성하시면 몇 번 include 하더라도, 중복 include 가 방지됩니다. 물론 stdio.h 나 기타 헤더들도 비슷하게 헤더 가드가 되어있습니다.
답변해주신 위 세 분께 감사합니다.제가 무언가 잘못 알고 있었나 봅니
답변해주신 위 세 분께 감사합니다.
제가 무언가 잘못 알고 있었나 봅니다.
봄들판에서다
댓글 달기