리눅스왕초보자입니다.makefile에 대해서 질문입니다~

bjeongh1의 이미지

안녕하세요 이번엔 임베디드를 처음 접하면서 리눅스를 동시에 처음으로 접하게 된늠입니다~ ^^
다름이 아니라 c언어로 프로그래밍을 해서 컴파일할때 makefile을 사용하면 더욱 간단하게 된다고 하길래 강좌도 보고 KLDP에 나오
는 강좌도 보고 있습니다만 그게 이해하기가 그렇게 쉽지가 않네요...본론으로 말씀드려서 한가지만 질문을 드리겠습니다.
아주 기초적인 makefile사용에 대해서요
test : main.o read.o write.o
gcc -o test main.o read.o write.o

main.o : io.h main.c
gcc -c main.c
read.o : io.h read.c
gcc -c read.c
write.o: io.h write.c
gcc -c write.c
vi makefile 이라는 파일을 만들어서 그대로 적어서 실행시켰는데 || make: *** `main.o'에서 필요로 하는 타겟 `stdio.h'를 만들 규칙이 없습니다. 멈춤.|| <----이런 에러가 뜹니다 물론 main.c read.c write.c 세파일을 생성했구요 셋다 stdio.h헤더파일을 쓰고요.
그리고 read.c write.c파일은 아무것도 안적고
#include stdio.h
int main(void)
{
return 0;
}
이런 문장만 쓰고 저장했습니다....main.c는 간단한 코딩을 했구요 이게 실행되는지 확인을 하기 위해서요 ^^

이상 제가 했는거랑 에러가 뜨는걸 적어놨습니다...잘몰라서 그러니까 리눅스//유닉스 고수님들 꼭 좋은 조언 부탁드립니다

체스맨의 이미지

main.o : io.h main.c 가 아니라,
main.o : stdio.h main.c 아닌가요?

오류 메시지는 현재 경로에서 stdio.h 파일을 못찾았기 때문에 나온 겁니다.

makefile 은 '의존성 정의 언어'라고 보시면 됩니다. 이런 개념하에서 메뉴얼들을 읽어보시기 바랍니다.

위 경우에 대해 설명 드리면, '콜론 : 의 좌측은 우측에 의존적이다.' 라서 해석하시면 되고, 그래서 우측이 변경되면 좌측을 갱신하기 위해 주어진 명령을 수행합니다. 예를 들어

main.o : stdio.h main.c
    gcc -c main.c

는 stdio.h 또는 main.c 가 변경되면 main.o 를 갱신하기 위해 gcc -c main.c 를 실행합니다.

make 유틸리티는 makefile 내에 기술된 이러한 의존성의 hierarchy 를 최 하단까지 추적합니다. 그러므로 위 예의 경우는 stdio.h 또는 main.c 에 대한 의존성이 더 있는지 판단합니다. 의존성이 없다면 stdio.h 나 main.c 가 변경되었는지 판단합니다. 변경되었는지 판단하려면 당연히 그 파일이 존재해야겠지요.

작성자분께서 제시하신 예에는 위 두 파일에 대한 의존성은 더 이상 없습니다. 그리고 현재 디렉토리에서 stdio.h 파일을 찾을 수도 없었기 때문에 지금과 같이 `stdio.h'를 만들 규칙이 없습니다 와 같은 메시지를 내보내는 것입니다.

그런데 실수 없이 올리신 거라면 main.o : io.h main.c 같은 의존성 규칙에서 그런 오류메시지가 make 유틸리티로 부터 나왔다는 것에 대해서는 잘 모르겠습니다.

그리고 지금 같은 상태이고, main.c 에도 main 함수가 있다면, 최종 빌드 후에 링커가 'main' 에 대해 duplicated symbol 오류를 낼 것 같군요...

Orion Project : http://orionids.org

bjeongh1의 이미지

main문 안에 stdio.h를 선언 해주고 makefile안에도 해주니까 안되네요 ㅋ
다시 수정하고 main문이랑 다른것들을 수정해서 하니까 되더라구요...이거 makefile의 의존성을 이해 잘못했는데 프로그램안에 함수랑
비슷한 개념인걸 이제야 알겠습니다 ^^

/*다른분이 사용하는 문구를 따서 왔습니다*/
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.