[완료] Makefile을 이용할때, 수정된 파일만 컴파일되게 하는 방법

klara의 이미지

Makefile을 이용하여 프로그램을 컴파일 할려고 합니다.
간단하게 다음과 같은 Makefile 파일을 작성하였습니다.

.SUFFIXES = .cpp .o
CXX = g++
OBJS_DIR = objects
SRCS = $(wildcard *.cpp)
OBJS = $(patsubst %.cpp, %.o, $(SRCS))
TARGET = polariton
 
all: dirs $(TARGET)
 
dirs:
	install -d $(OBJS_DIR)
 
$(TARGET): $(OBJS)
	$(CXX) -o $@ $(patsubst %, ./$(OBJS_DIR)/%, $(OBJS))
 
%.o : %.cpp
	$(CXX) -I. -c -o ./$(OBJS_DIR)/$@ $<
 
clean:
	rm -f $(patsubst %, ./$(OBJS_DIR)/%, $(OBJS)) $(TARGET)

그런데, make 할때마다 모든 파일을 컴파일합니다.
Makefile은 자동으로 관리해주는 걸로 알고 있었는데, 아무것도 안건드리고 make하고 바로 make 해도 다시 컴파일 하고 있더군요.
지금은 간단한 main.cpp 파일 하나뿐이지만, 파일이 많아지면 시간이 오래 걸릴듯합니다.
자동으로 관리하게 하기위해선 특별한 Makefile을 작성해야 하나요...?

zrobot의 이미지

고수님... 앞에서 요량을 ㅋ

mike1의 이미지


집에서 이 책에 비슷한 내용을 본 기억이 가물가물 하네요..

http://www.yes24.com/24/goods/2817871?scode=032&srank=8

시간 되시면 찾아 보세요..

Hyun의 이미지

컴파일 결과 오브젝트 파일을 ./$(OBJS_DIR)/ 디렉토리로 넣어주는데, make가 그에 대한 파일을 찾지 못해서 생기는 문제같네요.
오브젝트 파일을 현재 디렉토리에 생성하거나 $(OBJS)와 %.o: %.cpp 에도 디렉토리 이름을 같이 추가해보시기 바랍니다.


나도 세벌식을 씁니다
breadncup의 이미지

$(TARGET): $(OBJS)
	$(CXX) -o $@ $(patsubst %, ./$(OBJS_DIR)/%, $(OBJS))
 

에 보시면, prerequisite ($(OBJS))를 찾을 수 없으니, 항상 command 를 실행하게 되는 것입니다. 근데, command에 보면, object 파일들을 전부 $(OBJS) 에 저장하는 것이 아니라, 다시 $(OBJS_DIR)/에 저장하고 있기때문에 항상 make를 호출 할때 마다 다시 컴파일 하게 되는 것입니다.

klara의 이미지

답변 달아주신 분들 모두 감사합니다.
말씀하신대로 의존성에 OBJS_DIR이 포함되어있지 않아서 그랬던거 같습니다.
OBJS = $(patsubst %.cpp, ./$(OBJS_DIR)/%.o, $(SRCS))
로 고치니 매번 재컴파일 하는 문제가 해결되었습니다.

댓글 달기

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