[make] 에러의 원인을 잘 모르겠습니다.

ssif의 이미지

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]
hys545의 이미지

ssif wrote:
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]

에러는 업는데여
경고만 있을뿐
함수 정의에 문제가 있다고 하는데..

즐린

ssehoony의 이미지

warning: implicit declaration of function

이건 선언에 안되어 있다는 경고이고, 이럴 경우 c 컴파일러 일경우는 스스로 가정을 해버립니다.
선언이 안되있는건 c++ 에서는 에러이지만 C에서는 경고 이지요.

이건 include 를 안하면 나오는 에러입니다.
가령 serial.c 에서 printf 를 사용하셨는데 printf 는 stdio.h 에 선언되어 있습니다. 하지만 serial.c 에 stdio.h 를 include 안하셨네요

ssif의 이미지

ssehoony wrote:
warning: implicit declaration of function

이건 선언에 안되어 있다는 경고이고, 이럴 경우 c 컴파일러 일경우는 스스로 가정을 해버립니다.
선언이 안되있는건 c++ 에서는 에러이지만 C에서는 경고 이지요.

이건 include 를 안하면 나오는 에러입니다.
가령 serial.c 에서 printf 를 사용하셨는데 printf 는 stdio.h 에 선언되어 있습니다. 하지만 serial.c 에 stdio.h 를 include 안하셨네요

설명 감사합니다.하지만 제가 원했던것은 중복 #include 을 회피하고자 함이었습니다. 이미 main.c 에 include를 했는데 다시 include 를 한다는것은 좀 이상해 보여서 입니다.제가 의도하는 대로 우너하는 결과를 얻기위해서는 어떤 문서를 참조하면 좋겠습니까?

어찌보면 make와 관계없이 다른곳에서 잘못을 범하는것 같아 다시 질문드립니다. 전웅님의 'c언어 펜더멘탈'을 다시 보고 있는데도 이해가 가지 않습니다.

처음 제 질문이 잘못되었기 때문인것 같습니다.이점 사과드립니다.

덧:"질문하는 법"문서를 3~4달에 한번씩 보는데도 여전히 질문이 서툴러러 hys545님께 사과드립니다.

봄들판에서다

espereto의 이미지

ssif wrote:

설명 감사합니다.하지만 제가 원했던것은 중복 #include 을 회피하고자 함이었습니다. 이미 main.c 에 include를 했는데 다시 include 를 한다는것은 좀 이상해 보여서 입니다.제가 의도하는 대로 우너하는 결과를 얻기위해서는 어떤 문서를 참조하면 좋겠습니까?

헤더 파일이 아닌 서로 다른 소스 파일에서 동일한 헤더 파일을 include하는 것은 중복 include가 아닙니다.

오히려, 겪으셨던 경고나 혹은 다른 오류를 피하기 위해서는 동일한 헤더 파일이라도 include해 주어야 합니다. :-)
물론, 해당 소스 파일에서 필요로 하지 않는다면 include하지 않아야 하겠습니다면, 필요로 하는 헤더 파일은 동일한 헤더 파일이라고 하더라도 각 소스 파일에서 include 해 주는 게 맞습니다.

만일, 이 파일 저 파일 등등 여러 소스 파일에서 동일 헤더 파일에 대한 include 문이 여러 줄 생기고 이 때문에 관리상의 이유나 혹은 다른 이유로 부담이 되기 때문이라고 한다면, 각 소스에서 공통으로 include하는 임의의 헤더 파일을 작성하고, 해당 헤더 파일에서 include를 처리하는 방법도 있습니다.

이렇게 하면 각 소스에서는 하나의 헤더 파일만 include 해도 되겠지요.

--- 추가 ---
그러나 이 방법은 잘못하면 오히려 독이 됩니다.

쓸데 없는 헤더를 include 할 수 있고, 그때문에 컴파일 시간도 더 오래 걸리게되고, 서로 include 되어서는 안 되는 헤더 파일이 있는 경우에도 골치아파지고 등등...

잘 쓰면 좋지만요......

sodomau의 이미지

ssif wrote:
ssehoony wrote:
warning: implicit declaration of function

이건 선언에 안되어 있다는 경고이고, 이럴 경우 c 컴파일러 일경우는 스스로 가정을 해버립니다.
선언이 안되있는건 c++ 에서는 에러이지만 C에서는 경고 이지요.

이건 include 를 안하면 나오는 에러입니다.
가령 serial.c 에서 printf 를 사용하셨는데 printf 는 stdio.h 에 선언되어 있습니다. 하지만 serial.c 에 stdio.h 를 include 안하셨네요

설명 감사합니다.하지만 제가 원했던것은 중복 #include 을 회피하고자 함이었습니다. 이미 main.c 에 include를 했는데 다시 include 를 한다는것은 좀 이상해 보여서 입니다.제가 의도하는 대로 우너하는 결과를 얻기위해서는 어떤 문서를 참조하면 좋겠습니까?

어찌보면 make와 관계없이 다른곳에서 잘못을 범하는것 같아 다시 질문드립니다. 전웅님의 'c언어 펜더멘탈'을 다시 보고 있는데도 이해가 가지 않습니다.

처음 제 질문이 잘못되었기 때문인것 같습니다.이점 사과드립니다.

덧:"질문하는 법"문서를 3~4달에 한번씩 보는데도 여전히 질문이 서툴러러 hys545님께 사과드립니다.

main.c 에 stdio.h 를 인클루드 해줬다 하더라도
serial.c 에 다시 stdio.h를 인클루드 해줘야 합니다.
중복 include랑은 관계가 없습니다.
쉽게 설명해서
main.o 를 만들때 printf 의 함수원형에 대한 정보를 알고 있어야 하고,
이와는 완전히 독립적으로
serial.o 를 만들때 printf의 함수원형에 대한 정보를 알고 있어야 하기 때문입니다.
혹시나 잘못 알고 계실까봐 드리는 말씀이지만
include 해 준다고 printf 의 코드가 두 오브젝트 파일에 포함되는 그런 일은 없습니다.
단지 함수원형만 알려준다고 생각하시면 가장 편하실껍니다.

수정) 아.. 제출 눌러 보니 이미 윗분이 답글을..;

ez8의 이미지

흔히 말하는 중복 include 는 헤더 가드가 되어있으면 방지됩니다.

serial.h 에서 하신 것 처럼

#ifndef SOME_H
#define SOME_H
어쩌구 저쩌구 헤더 내용들
#endif

와 같이 헤더를 작성하시면 몇 번 include 하더라도, 중복 include 가 방지됩니다. 물론 stdio.h 나 기타 헤더들도 비슷하게 헤더 가드가 되어있습니다.

ssif의 이미지

답변해주신 위 세 분께 감사합니다.
제가 무언가 잘못 알고 있었나 봅니다.

봄들판에서다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.