gcc의존성에 조사 해서 컴파일 되게 하고 싶은데... 왜 안 되는

onemind555의 이미지

make를 하면 파일을 시간을 비교해서 컴파일 한다고 알고 있는데..
h(헤더)파일을 수정해서 make를 실행 시키면 컴파일을 하지 않습니다.
물론 make dep는 실행 해 줬습니다.. 무엇이 잘 못 된 건가요...
및에 makefile를 요약 해서 올립니다..

Quote:

EXAMPLE_SRCS = cpp로 끝나는 파일들..
EXAMPLE_OBJS = $(EXAMPLE_SRCS:.cpp=.o)

CPPFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -I./../../../boost/
CC = g++ -c

.SUFFIXES : .cpp .o

example : ${EXAMPLE_OBJS} ${EXAMPLE_SRCS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep :
gccmakedep ${EXAMPLE_SRCS}

Necromancer의 이미지

의존성 명시하는 부분에 *.cpp 파일만 지정하신건 아닌지요?

EXAMPLE_SRCS = cpp로 끝나는 파일들..
EXAMPLE_OBJS =  $(EXAMPLE_SRCS:.cpp=.o)

CPPFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE  -I./../../../boost/
CC = g++ -c

.SUFFIXES : .cpp .o

example : ${EXAMPLE_OBJS} ${EXAMPLE_SRCS}    # <- *.h 파일은 어디로?
	g++ -o example  ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep  :
	gccmakedep ${EXAMPLE_SRCS}

Written By the Black Knight of Destruction

onemind555의 이미지

무슨 뜻인지 잘 모르겠습니다..
make dep만 호출 하면 의존성 관계 다 조사 하는 줄 알고 있었는데...

혹시 SUFFIXES 가 의존성과 관련 있는 것인가요?

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

onemind555의 이미지

앞에 주석으로 설명을 해 주셨군요...

헤더도 따로 지정 해줘야 하는 군요...

도움 주셔서 감사 합니다....

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

onemind555의 이미지

Quote:

example : ${EXAMPLE_OBJS} ${EXAMPLE_SRCS} ${EXAMPLE_HEADS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

위에 처럼 하고 헤더 파일을 수정을 하면 링킹만 다시 일어 날 뿐 컴파일은 안 하더군요...

확장자 규칙에서 어떻게 의존성 여부를 정하게 할 것 같은데 방법을 아시는 가요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

ironiris의 이미지

make clean 이 해결책이 아닐런지요.
(언제 전부 다시 컴파일하나.. --;;;)

onemind555의 이미지

make clean해서 다시 컴파일 하라니...

장난 치지 마세요.. 기분 안 좋습니다..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

vacancy의 이미지

컴파일을 다시 하게 하려는 거라면,

object file들(.o)이 header file들(.h)에 의존하고 있어야겠죠.

onemind555의 이미지

o파일을 h파일에 의존성을 주려고 하면 어떻게 해야 하는 가요..
요..

cpp를 파일 규칙으로 o파일로 바꾸었는데.. 여기에 줄수 있는 문법이 있는 가요...

Quote:
${EXAMPLE_OBJ} : ${EXAMPLE_SRCS} ${EXAMPLE_HEAD

위에는 없지만 이라인도 추가 했지만 아무런 영향력을 못 주더군

makedep는 그냥 폼으로 있는 것 같네요. 아무런 도움도 못 주는 군요...

%문법이 애매해서 정말 짜증도 나고 되지는 않고..
스크립터 플그램 돌려 일일이 하나하나 컴파일 되게 하면 의존성 이 해결 될까요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

lotus의 이미지

참고로 제 간단한 makefile을 올려드립니다.

CXX=g++
CXXFLAGS=
SRCS=hello.cpp func1.cpp
HEADERS=hello.h
OBJS=$(SRCS:.cpp=.o)
OUTPUT=hello

all : $(OBJS) $(HEADERS)
    $(CXX) -o $(OUTPUT) $(CXXFLAGS) $(OBJS)
dep :
    gccmakedep $(SRCS)

이 파일을 만든후 make dep해주시면 object 파일에 필요한 header정보가 자동으로 붙는데요.
이후 hello.h의 내용을 수정하면 알아서 잘 컴파일해 줍니다.

onemind555의 이미지

내가 만든 것이랑 별로 다른 점은 없는데..
왜 저는 안 되는지 모르겠군요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

lotus의 이미지

onemind555 wrote:
내가 만든 것이랑 별로 다른 점은 없는데..
왜 저는 안 되는지 모르겠군요...

않되는 makefile을 다시 한번 올려주세요..

onemind555의 이미지

make 좇 같이 만들어 놨군요... 에러 메세지를 내기를 하나 로그 메세지도 내지도 안고 제대로 되는지 안 되는지 아무런 메세지도 내어 놓지도 않는데 도대체 어떻게 하라는 건지 모르겠네요...

gnu에서 만든 것중 믿을 만 한건 gcc컴파일러 밖에 없다는 생각 이 드는 군요..

지금 제가 만들고 있는 것이 kldp.net 에 podo라고 리눅스 윈도우 겸용 GUI라이브러리 입니다. 대부분 작업을 윈도우에서 하기 때문에 리눅스 에서 개발은 컴파일 작동 확인 정도입니다... 리눅스에서는 디버깅도 어렵잖아요...

그냥 make clean , make 실행 해서 기다리는게 낫을 것 같네요..전체가 3분정도이면 컴파일이 되는데 제가 2시간 가까이 이걸 해결 하려고 하는 지 모르겠네요.. ( 2시간 이면 왠 만한 버그는 다 찾아 고칠 수 있는데.. 제가 미친 짓을 한 것 같네요...)

도움 주려고 한건 고맙습니다.

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

elecguy의 이미지

저두 가끔 경험하는 것입니다만.
다른 사람의 소스를 받아다가 컴파일하면 제대루 컴파일을 안한다는..
살펴보면 다른사람 컴의 날짜가 제컴보다 빠른경우에 그러더군요.
위의 질답에 미루어보아 윈도에서 주로 작업하고 리눅스에서 확인하는 것 같은데..
윈도와 리눅스의 날짜를 함 비교해보세요..
그럼.

폐인, 노가다 그 끝은..?

체스맨의 이미지

clock skew 가 있다면 일단 make clean 하고 소스 날짜를 touch 해주는게
속편할 겁니다. 다음은 recursive touch script 입니다.
실행된 현재 디렉토리의 하부 디렉토리에 속한 모든 파일의 날짜를 touch
합니다.

#!/bin/sh
# sh, find, touch, chmod commands are needed

if [ -z "$1" ]; then
	echo "Processing..."
	find -exec sh $0 \{\} \;
	echo "O.K."
else
	if ! [ -d "$1" ]; then # not a directory
		if [ -w "$1" ]; then
			touch "$1"
		else
			chmod u=+w "$1"
			touch "$1"
			chmod u=-w "$1"
		fi
	fi

fi

# EOF

Orion Project : http://orionids.org

onemind555의 이미지

날짜 문제는 아닌 듯 합니다.. 뭣 때문인지는 모르겠습니다. 그러니 미치고 환장 할 노릇 이죠... 아까 이것 때문에 흥분 해서 이제야 진정이 되었는데.. 다시 건드리면 다시 흥분 할 것 같아 건드리기 싫어요...

오픈 소스로 할 건데 다른 사람이 해결 해주길 기다리는 방법과 제대로 작동 안 하는 make가지고 씨름 하느니..

해결 안 되면 그냥 내가 직접 파일을 파싱해서 의존성 관계를 알아 내서 makefile에 명시적으로 의존성 관계를 지정해주고 make하는 방법을 생각 하고 있습니다..만드는데 시간도 그렇게 오래 걸릴 것 같지 않고 .... 믿을 만 하고...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

체스맨의 이미지

onemind555 wrote:

해결 안 되면 그냥 내가 직접 파일을 파싱해서 의존성 관계를 알아 내서 makefile에 명시적으로 의존성 관계를 지정해주고 make하는 방법을 생각 하고 있습니다..만드는데 시간도 그렇게 오래 걸릴 것 같지 않고 .... 믿을 만 하고...

저는 주로 명시적 의존성만 사용합니다. 헤더 의존성은 특별히 잘 걸지
않구요. 오히려 컴파일 속도는 향상되죠. 단, 헤더 변경할 때 좀 주의를
기울여서 빌드해야 하지만요.

명시적 의존성이 여러 make 툴 ( 비 UNIX 계열 )에서도 잘 작동
(서로 다른 make 툴에서 같은 makefile 을 사용하더라도...)하는 것
같습니다. 각 모듈 또는 라이브러리에 대해 명시적 의존성을 정의해놓은 파일을
만들어 놓고 인클루드해서 쓰는 편입니다.

Orion Project : http://orionids.org

cdpark의 이미지

onemind555 wrote:
make clean해서 다시 컴파일 하라니...

장난 치지 마세요.. 기분 안 좋습니다..

답변 달 마음이 사라지는군요. :( 그래도 마음 추스리고 답변을 달아봅니다.

1. Makefile에 .SUFFIXES 룰을 추가한 이유는요? 기본적으로 없어도 동작할텐데요? 그리고 준다면 순서를 제대로 주시거나요. .o 다음에 .cpp가 와야 합니다.

2. CC= 부분은 잘못되었습니다. .cpp에서 .o 파일을 만들 때에는 CXX 파일이 불립니다.

onemind555 wrote:
make 좇 같이 만들어 놨군요...

제가 보기엔 Makefile을 뭣같이 만들어놓고 불평이신듯 싶네요.
kyong의 이미지

onemind555 wrote:
make를 하면 파일을 시간을 비교해서 컴파일 한다고 알고 있는데..
h(헤더)파일을 수정해서 make를 실행 시키면 컴파일을 하지 않습니다.
물론 make dep는 실행 해 줬습니다.. 무엇이 잘 못 된 건가요...
및에 makefile를 요약 해서 올립니다..

Quote:

EXAMPLE_SRCS = cpp로 끝나는 파일들..
EXAMPLE_OBJS = $(EXAMPLE_SRCS:.cpp=.o)

CPPFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -I./../../../boost/
CC = g++ -c

.SUFFIXES : .cpp .o

example : ${EXAMPLE_OBJS} ${EXAMPLE_SRCS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep :
gccmakedep ${EXAMPLE_SRCS}

make dep 하신 후에
# DO NOT DELETE
뒤에 붙는 파일들이 제대로 붙었는지 확인하시고요,
make -p
해서 파일이 update 됐는지도 보세요.

컴파일이 자꾸 돼서 문제라면
make t
해서 날짜만 갱신할 수 있습니다.
그리고 참고로 삼바로 공유할 때 날짜 때문에 Visual C로 컴파일 할 때,
자꾸 재 컴파일 되는 문제가 있을 수 있는데, 이땐
smb.conf
다음과 같이 추가하면 도움이 될 것입니다.
dos filetimes = yes
fake directory create times = yes
dos filetime resolution = yes

윈도우와 시간을 동기시킬 때
time server = yes
로 하고
net time \\samba_server /set /yes

kyong의 이미지

cdpark wrote:

1. Makefile에 .SUFFIXES 룰을 추가한 이유는요? 기본적으로 없어도 동작할텐데요? 그리고 준다면 순서를 제대로 주시거나요. .o 다음에 .cpp가 와야 합니다.

이것은 상관 없는 것 같습니다. 물론 기본 룰을 바꾸지 않으면서 추가할 특별한
이유는 없는 것 같지만요.

Quote:

2. CC= 부분은 잘못되었습니다. .cpp에서 .o 파일을 만들 때에는 CXX 파일이 불립니다.

CXX 기본값이 g++이니 동작은 하겠죠.
CPP = $(CC) 이런 식으로 들어가기 때문에
${CPP}라고 해 주는 것이 의미상 맞겠죠.
그러나 C랑 분명히 구분하는 것이 더 좋을 듯 합니다. 플래그까지.
Quote:

onemind555 wrote:
make 좇 같이 만들어 놨군요...

제가 보기엔 Makefile을 뭣같이 만들어놓고 불평이신듯 싶네요.

험한 말 자꾸 쓰면 프로그래머 성격 괴팍하다는 말만 자꾸 듣습니다.
자제합시다:)

advanced의 이미지

onemind555 wrote:
make 좇 같이 만들어 놨군요... 에러 메세지를 내기를 하나 로그 메세지도 내지도 안고 제대로 되는지 안 되는지 아무런 메세지도 내어 놓지도 않는데 도대체 어떻게 하라는 건지 모르겠네요...

사용자 불량인듯 싶은데 말을 너무 심하게 하시는군요

그 많고 큰 프로젝트들이 make 로 완성되었다는걸 생각하시면 뭔가 원인이

있지 않나 다시 잘 살펴보셨어야 하셨습니다.

- advanced -

cdpark의 이미지

kyong wrote:
cdpark wrote:

1. Makefile에 .SUFFIXES 룰을 추가한 이유는요? 기본적으로 없어도 동작할텐데요? 그리고 준다면 순서를 제대로 주시거나요. .o 다음에 .cpp가 와야 합니다.

이것은 상관 없는 것 같습니다. 물론 기본 룰을 바꾸지 않으면서 추가할 특별한
이유는 없는 것 같지만요.

이게 원하는대로 되지 않는 주된 이유입니다. ".cpp .o" 순으로 주면 .o 파일에서 .cpp 파일을 만들라는 뜻이거든요. 원하는 작업은 .o 파일을 .cpp 파일에서 만드는 것인데도요.

참고로 make의 기본 SUFFIXES 순서는 다음과 같습니다. (debian woody에 있는 make 3.79.1)

.out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el

kyong의 이미지

cdpark wrote:
kyong wrote:
cdpark wrote:

1. Makefile에 .SUFFIXES 룰을 추가한 이유는요? 기본적으로 없어도 동작할텐데요? 그리고 준다면 순서를 제대로 주시거나요. .o 다음에 .cpp가 와야 합니다.

이것은 상관 없는 것 같습니다. 물론 기본 룰을 바꾸지 않으면서 추가할 특별한
이유는 없는 것 같지만요.

이게 원하는대로 되지 않는 주된 이유입니다. ".cpp .o" 순으로 주면 .o 파일에서 .cpp 파일을 만들라는 뜻이거든요. 원하는 작업은 .o 파일을 .cpp 파일에서 만드는 것인데도요.

참고로 make의 기본 SUFFIXES 순서는 다음과 같습니다. (debian woody에 있는 make 3.79.1)

.out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el


suffix list 와 suffix rule을 헷깔리신 것 같습니다.
.cpp.o:
와 같이 suffix rule 은 지켜야 하지만
.SUFFIXES: 에서는 그냥 정의하고 싶은 suffix를 추가하는 곳이 아닙니까?
Quote:

`.SUFFIXES'
The prerequisites of the special target `.SUFFIXES' are the list
of suffixes to be used in checking for suffix rules. *Note
Old-Fashioned Suffix Rules: Suffix Rules.

--update
implicit rule임은 분명합니다. 단순히 제가 말한 list 라는 개념은 틀렸고요.
근데 여기서는 기존에 것에 추가되는 것이기 때문에 중복됩니다.
.SUFFIXES:
.SUFFIXES: .cpp .o
이렇게 했다면 기존의 것을 지우고 새로 넣는 것이지요.
사실 제가 테스트 해 보니 동작하는데는 문제가 없는 것 같습니다.
cdpark의 이미지

kyong wrote:
.SUFFIXES: 에서는 그냥 정의하고 싶은 suffix를 추가하는 곳이 아닙니까?

아닙니다. :x 그 순서가 "매우" 중요합니다. (GNU make의 관련 문서에선 자세한 설명이 빠져 있군요.) .SUFFIXES에 적힌 순서대로 자동으로 dependency가 생긴다고 생각하면 됩니다.

lotus의 이미지

이 버전이 가장 마음에 드는 군요.

SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
DEPS = $(OBJS:.o=.d)

edit : $(OBJS)
    g++ -o $@ $(OBJS)

%.o : %.cpp
    g++ -c -o $@ $<

clean:
    rm -f edit $(OBJS) $(DEPS) $(DEPS:.d=.d.*) *~

include $(DEPS)

%.d: %.cpp
    @set -e; rm -f $@; \
    g++ -M $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

onemind555의 이미지

앞에 어떤 분이 써 놓은 것을 보고 힌트를 얻어

Quote:

%.o : %.cpp %.h
g++ -c -o $@ $< ${CPPFLAGS}

이렇게 하니 컴파일 하긴 하더군요..
근데 의존성 완벽히 따져 하는 건 아닌 것 같습니다.. %.h 를 없애면 파일 변화를 감지를 못하더군요..

근데 혹시 폴더 경로하고 관계가 있는 건가요.. 여기 저기 뿌려져 있는 cpp파일을

Quote:
SRCS = ../../dir/Filename.cpp
이런 식으로 relate패스를 걸어 놨는데.. 이것 때문에 찾지 못하는 것 아닐 까라는 생각도 드는 군요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

unipro의 이미지

gccmakedep 에서 헤더파일들의 경로를 추가시켜야 하는 것은 아닐까요?

# ...

INCLUDES = -I./../../../boost/ 

# ...

dep :
	gccmakedep ${INCLUDES} ${EXAMPLE_SRCS}

내 블로그: http://unipro.tistory.com

kyong의 이미지

cdpark wrote:
kyong wrote:
.SUFFIXES: 에서는 그냥 정의하고 싶은 suffix를 추가하는 곳이 아닙니까?

아닙니다. :x 그 순서가 "매우" 중요합니다. (GNU make의 관련 문서에선 자세한 설명이 빠져 있군요.) .SUFFIXES에 적힌 순서대로 자동으로 dependency가 생긴다고 생각하면 됩니다.


제가 보기엔 그렇게 중요한 것이 아닙니다.
왜냐면 구현상 그렇게 돼 있기 때문입니다.
진짜 중요한 것은
all: example

example: example.o example2.o

처럼 어디에 의존하는지 기술한 것입니다.
위와 같이 제대로 돼 있다면,
.o.cpp:
    $(CXX) $(CXXFLAGS) -c $< -o $@

이렇게 기분 룰을 overiding 하더라도
make: Circular example.cpp <- example.o dependency dropped.
g++    -c -o example.o example.cpp
make: Circular example2.cpp <- example2.o dependency dropped.

다음과 같은 에러를 낼 뿐 동작은 하도록 돼 있습니다.
comouse의 이미지

커널 소스에서 사용하는 것처럼
.depend 파일 만들어서 포함해 보세요 ^^;;

.depend:
	$(CC) -E -MM $(SRCS) > .depend

dep:
	rm -f .depend
	$(MAKE) .depend

ifeq (.depend,$(wildcard .depend))
include .depend
endif

kyong의 이미지

제가 시간이 남아 도는 모양이네요.

onemind555 wrote:

EXAMPLE_SRCS = cpp로 끝나는 파일들..
EXAMPLE_OBJS = $(EXAMPLE_SRCS:.cpp=.o)

CPPFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -I./../../../boost/
CC = g++ -c

.SUFFIXES : .cpp .o

example : ${EXAMPLE_OBJS} ${EXAMPLE_SRCS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep :
gccmakedep ${EXAMPLE_SRCS}


여기서 문제점은 2가지 방법으로 고칠 수 있습니다.
dep target을 고치든지 아니 .PHONY 를 추가 하는 것입니다.
가장 좋은 방법은 .PHONY를 추가 하는 것입니다.
.PHONY example

한 번 컴파일 한 후에 example 이란 파일이 만들어 졌는데 이 파일의 날짜랑
상관없이 업데이트하도록 해주는 것이 .PHONY 입니다.
이것은 거의 필수 입니다.
example2.o : example2.cpp example2.hpp

위와 같이 의존 관계에 헤더 파일까지 명시 돼 있다면 dep는 빼도 됩니다.

2번째 방법은 depend 했을 때 아예 컴파일까지 하도록 하는 것입니다.

$(CXX)  -MF Makefile.dep $(CXXFLAGS) -MMD $(SRCS)

아래 예에서 dep target만 실행 했을 때는 .PHONY가 없을 경우
업데이트가 안되는 것입니다. 바로 님의 경우에 해당하죠.

참고로 제가 만든 Make file 입니다.

CXX = g++
CXXFLAGS = -O

SRCS = example.cpp example2.cpp
OBJS = $(SRCS:.cpp=.o)

all : example

example : $(OBJS)
    $(CXX) -o example $(OBJS)

clean:
    rm -f *.o example Makefile.dep

dep:
    rm -f Makefile.dep
    $(CXX) -E -MF Makefile.dep $(CXXFLAGS) -MM $(SRCS)

depend:
    rm -f Makefile.dep
    $(CXX)  -MF Makefile.dep $(CXXFLAGS) -MMD $(SRCS)

-include Makefile.dep

.PHONY: all example clean dep depend
onemind555의 이미지

답변 해주신건 고맙지만 근데 무슨말인지 하나도 모르겠어요..
.dep파일이 어디서 생겼는지도 모르겠고 ...
정말 복잡 하군요..

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

kyong의 이미지

onemind555 wrote:
답변 해주신건 고맙지만 근데 무슨말인지 하나도 모르겠어요..
.dep파일이 어디서 생겼는지도 모르겠고 ...
정말 복잡 하군요..

Quote:

EXAMPLE_SRCS = $(wildcard *.cpp)
EXAMPLE_OBJS = $(EXAMPLE_SRCS:.cpp=.o)

CXXFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -I./../../../boost/

example : ${EXAMPLE_OBJS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep :
gccmakedep ${EXAMPLE_SRCS}

.PHONY: example dep


이 정도면 될 것 같습니다.
헤더 수정 한 후
make dep
make
하시면 됩니다.
같은 헤더라면 다음에 할 땐 make dep 안 해도 되겠죠.
그리고 좀 더 설명은 하면,
example : ${EXAMPLE_OBJS} 에 의존하고 있는데 헤더를 수정했지만
*.o 파일이 수정 된 것이 아니 잖습니까? 여기에 헤더가 올려진 것도아니고요.
그러나 make dep 이
example.o : example.cpp example.h
이렇게 만들어 줘서 돼야 한다는 것이죠.
그러나 한 번 컴파일 한 후라면 최종으로 만들어진 example 가 이미 있기
때문에 make는 아무 할 일이 없다고 말하는 것이죠.
.PHONY는 바로 이런 것을
해결하기 위한 것입니다.
난 죽어도 .PHONY를 추가하고 싶지 않다고 하시면
최종 바이너리 이름을 다른 것으로 바꾸세요.
--UPDATE
그러나 .PHONY가 없고 최종바이너리 이름과 같더라도
make dep 해서 example.o : example.cpp example.h 와 같이
제대로 들어가 있으면 동작해야 합니다. (GNU Make version 3.79.1)
kyong의 이미지

onemind555 wrote:

.dep파일이 어디서 생겼는지도 모르겠고 ...

gccmakedep 은 gcc -M이랑 같은 것입니다.
gccmakedep 했을 때는 기본적으로 Makefile에 포함하는 것이고
제가 만든 Makefile.dep은 옵션을 줘서 따로 만들어서, include 한 것입니다.
onemind555의 이미지

해도 안 되는 군요.. 한가지 알 아낸 사실은 make dep실행 하고 make를 실행 한 것과 make dep를 실행 안하고 make를 실행 한 것이 거의 똑같은 행동을 한다는 것을 알 아 냈습니다..

make버그 인지 내가 잘 못 한 것 인지는 모르 겠지만 해결 안 되는 군요..

make dep까지 해서 만들어진 makefile전부를 축약해서 올려 봅니다.

Quote:

EXAMPLE_HEADS = \
../../global/AggregationAttribute.h\
../../wrapper/View.h\
../../wrapper/VolatileWindow.h\
../../wrapper/WStringData.h\
../../wrapper/WStringDataHaver.h\
../../wrapper/XyLayoutManager.h\
../../wrapper/canvas/Canvas.h\
../../wrapper/canvas/CanvasHaver.h\
../../wrapper/system/Mouse.h

EXAMPLE_PTRS = \
../../wrapper/process/MouseStateFactory.p\
../../wrapper/system/DragData.p

EXAMPLE_SRCS = \
../create_volatile/main.cpp\
../../wrapper/system/DragData.cpp\
../../wrapper/system/Mouse.cpp

EXAMPLE_OBJS = $(EXAMPLE_SRCS:.cpp=.o)

CPPFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -D_PODO_DEBUG -D_PODO_POSIX -I./../../../boost/
#CXXFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -D_PODO_DEBUG -D_PODO_POSIX -I./../../../boost/
CPP = g++ -c
#CXX = g++ -c

#.SUFFIXES : .cpp .o

all : example

example : ${EXAMPLE_OBJS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep :
gccmakedep ${EXAMPLE_SRCS}

clean :
rm ${EXAMPLE_OBJS} example

.PHONY: example dep

# DO NOT DELETE
Brush.o: ../../global/Brush.cpp ../../global/Brush.h ../../global/Color.h \
/usr/include/c++/3.2.2/string \
/usr/include/c++/3.2.2/i586-mandrake-linux-gnu/bits/c++config.h \
/usr/include/c++/3.2.2/i586-mandrake-linux-gnu/bits/os_defines.h \

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

onemind555의 이미지

make dep해서 따라 붙는 내용들이 특수한 내용이 아니고 단순 의존성 관계를 적어 놓은 것이군요.. DO NOT DELETE는 그냥 주석이고..

당연히 안 될 수 밖에 없군요..
및에는 aaa.o : 이렇게 해서 의존성 관계를 표시 하고 있는데 이건 아니거든요.. aaa.o 이런 파일은 전부 상대 경로를 같이 표시 해야 하는데 상대 경로가 빠졌군요...

%%% 결론은 make 버그 이라는 것이 결론 입니다.... 엄연히 따지면 gcc의 버그라 할 수 있겠군요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

onemind555의 이미지

운영자님이 고쳐야 할 게시판 버그 군요...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

정태영의 이미지

onemind555 wrote:
운영자님이 고쳐야 할 게시판 버그 군요...

위에 위엣 글에서..
makefile내용을 다른곳에 링크를 걸어주심 어떨까 싶습니다..

보기 아주 불편하군요 :roll:
그리고 위에 위엣글에서.. 끝에 [ /quote] 추가해주세요 =3=33

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

envia의 이미지

onemind555 wrote:
운영자님이 고쳐야 할 게시판 버그 군요...

원래 이렇습니다. 코드는 Quote가 아닌 Code로 인용해 주시기 바랍니다.

----

It is essential, if man is not to be compelled to have recourse, as a last resort, to rebellion against tyranny and oppression, that human rights should be protected by the rule of law.
[Universal Declaration of Human Rights]

onemind555의 이미지

아까는 인용을 1천 라인 넘게 했었거던요.. 그랬더니 게시판이 이상하게 보였습니다...

-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................

kyong의 이미지

onemind555 wrote:
해도 안 되는 군요.. 한가지 알 아낸 사실은 make dep실행 하고 make를 실행 한 것과 make dep를 실행 안하고 make를 실행 한 것이 거의 똑같은 행동을 한다는 것을 알 아 냈습니다..

이제야 아셨어요?
제가 보기엔 make를 반드시 잘 알아야 할 처지인제 너무 모르시고 막 쓰기부터
하신 것 같습니다.

Quote:

make버그 인지 내가 잘 못 한 것 인지는 모르 겠지만 해결 안 되는 군요..

잘 못 쓰고 계신 것 같습니다.

Quote:

EXAMPLE_HEADS = \
../../global/AggregationAttribute.h\
../../wrapper/View.h\
../../wrapper/VolatileWindow.h\
../../wrapper/WStringData.h\
../../wrapper/WStringDataHaver.h\
../../wrapper/XyLayoutManager.h\
../../wrapper/canvas/Canvas.h\
../../wrapper/canvas/CanvasHaver.h\
../../wrapper/system/Mouse.h

EXAMPLE_PTRS = \
../../wrapper/process/MouseStateFactory.p\
../../wrapper/system/DragData.p

EXAMPLE_SRCS = \
../create_volatile/main.cpp\
../../wrapper/system/DragData.cpp\
../../wrapper/system/Mouse.cpp

EXAMPLE_OBJS = $(EXAMPLE_SRCS:.cpp=.o)

CPPFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -D_PODO_DEBUG -D_PODO_POSIX -I./../../../boost/
#CXXFLAGS = -g -D_DEBUG -D_GCC -D_UNICODE -D_PODO_DEBUG -D_PODO_POSIX -I./../../../boost/
CPP = g++ -c
#CXX = g++ -c

#.SUFFIXES : .cpp .o

all : example

example : ${EXAMPLE_OBJS}
g++ -o example ${EXAMPLE_OBJS} -lX11 -L/usr/X11R6/lib

dep :
gccmakedep ${EXAMPLE_SRCS}

clean :
rm ${EXAMPLE_OBJS} example

.PHONY: example dep

# DO NOT DELETE
Brush.o: ../../global/Brush.cpp ../../global/Brush.h ../../global/Color.h \
/usr/include/c++/3.2.2/string \
/usr/include/c++/3.2.2/i586-mandrake-linux-gnu/bits/c++config.h \
/usr/include/c++/3.2.2/i586-mandrake-linux-gnu/bits/os_defines.h \


이런 식으로 포스팅하는 것은 도움이 별로 안 되는 것 같습니다.
항상 포스팅 할 때는 최소한의 동작하는 코드를 첨부하든지 다른 분이 말한
것 처럼 붙일 수 없다면 링크를 하고 에러가 났을 때는 그 메세지 같이 첨부해야
하는 것입니다.
남들로 하여금 자꾸 추측만 하도록 하지 마세요.

gccmakedep이 include path가 어떻게 되는지 어떻게 알지요?
gccmakedep -- $(CFLAGS) -- $(SRCS)

SRC 리스트에 상대 경로를 넣어서 사용하는 것은 올바른 방법이 아닙니다.
그렇다면 OBJ 리스트에는 왜 전체 경로를 넣지 않으신 것입니까....
-L 옵션을 활용하세요.

make는 하나의 파일이 모든 다른 디렉토리의 행동을 결정하도록 만들어
져 있지 않습니다.
각 주요 모듈별로 따로 만드시기 바랍니다.

댓글 달기

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