컴파일을 release용과 debug용을 따로 하고 관리 하고 싶은데...

onemind555의 이미지

make해서 컴파일을 하면 .o라는 파일이 생기는데...

디버그의 용도로 컴파일 해서 생긴 Object와 Release용도로 컴파일 해서 생긴 Object를 따로 보관 하는 방법이 없을 까요..

서로 안 겹치지 않게 하는 방법이 없을 까요..

세벌의 이미지

CVS나 subversion등을 이용해보시면 어떨까요?

정태영의 이미지

onemind555 wrote:
make해서 컴파일을 하면 .o라는 파일이 생기는데...

디버그의 용도로 컴파일 해서 생긴 Object와 Release용도로 컴파일 해서 생긴 Object를 따로 보관 하는 방법이 없을 까요..

서로 안 겹치지 않게 하는 방법이 없을 까요..

디렉토리 구조를..
src/
release/
objects/

정도로 해서.. 실제 소스는 src에 놔두고..
release와 objects에는.. src에 있는걸 심볼릭링크걸어서 사용해봄 어떨까요 =3=33

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

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

barmi의 이미지

VisualC++방식은 어떨 지...
하위 디렉토리에 /Debug, /Release 라는 디렉토리를 만들어 그쪽에 .o, 실행화일을 만드는 겁니다.
Makefile을 적당히 조절하셔서
$ make [ all | debug | release ]
처럼 하셔도 되구요.

저는 아예 실행화일 이름도 다르게 해서 /bin화일에 따로 복사를 하긴 하는데,
이건 한소스로 실행화일 여러개 만들때나 필요하구요..그냥 위 정도만 해도 별 문제는 없을 거 같습니다.

saxboy의 이미지

Quote:
디렉토리 구조를..
src/
release/
objects/

정도로 해서.. 실제 소스는 src에 놔두고..
release와 objects에는.. src에 있는걸 심볼릭링크걸어서 사용해봄 어떨까요 =3=33

결국 크로스컴파일과도 비슷한 문제가 되는데, 저도 소스를 한군데에 모아놓고, 디렉토리를 나누는 방식을 주로 사용합니다. Makefile도 아예 따로 만들어놓고, 디렉토리마다 필요한 파일들을 링크를 걸어서 사용하면 큰 불편없이 사용하실 수 있으리라 믿습니다.

세이군의 이미지

소스는 그대로 두고 결과 파일만 다른 디렉토리에 놓는 방법도 있습니다.
일부 오픈소스 프로그램의 컴파일 과정을 보면
.libs 디렉토리를 만들고 그 안에 .o나 .a를 생성합니다.

Makefile 안에 이런식으로 적더군요..

.c.o :
$(CC) $(CFLAGS) -o Debug/$< -c $@

원래 파일을 다시 봐야 알겠지만 make의 특수코드를 이용해서 위와 비슷한 내용을 구성하고 있습니다.

이를 응용하면 될 것 같네요..

pynoos의 이미지

automake 를 사용합니다.

바이너리 target을 만들 때, 예를 들어, prog 라는 바이너리와 prog_d 라는 바이너리가 만들어지도록합니다.

그리고 소스를 같이 하면 디렉토리 안에

prog-src1.o
prog_d-src1.o

과 같이 소스별 Object 를 알아서 관리해줍니다.

그리고 나중에 테스트 할 때 _d 는 디버그용이고 없는 것이 릴리즈 용으로 사용하면 됩니다.

onemind555의 이미지

각각의 폴더에 넣는 방법을 추천 하시는 군요...
debug
release

이렇게 구분해서 한다고 했을때
makefile는 debug, release폴더에 넣는 건가요??

그리고,,
모든 경로의 파일을 컴파일 해서 오브젝트 파일을 어떻게 복사 해 오는 가요...

예를 들면

SRC = ../dir/aaa.cpp
OBJ = aaa.o

이걸 컴파일 한다고 했을때 파일 확장자 규칙을 사용 할 수 없는데..OBJ를 어떻게 특정 폴더에 생성 할 수 있나요..?
의존성은 어떻게 지정해 줄 수 있나요..

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

fatman의 이미지

obj 디렉토리 밑에 debug와 release 디렉토리를 따로 만들어서 object file을 저장합니다. 실행파일은 release용은 실행파일_이름, debug용은 실행파일_이름.dbg로 해서 구분하고요. 물론, 이런 작업은 Makefile내에서 모두 정의를 해 두고 사용합니다. 컴파일할 때만 make option=debug, make option=release 이런 식으로 사용하고 있습니다. 이것도 귀찮아서 alias를 해 놓고 있습니다. 예를 들면 Makefile안에 다음과 같이 구분해서 사용하고 있습니다.

=========================================

CC = cc
SRC = ./

if(option, debug)
CFLAGS = -g
OBJDIR = ../obj/debug
EXEFILE = $(PROGRAM).dbg
...
endif

if(option, release)
CFLAGS = -O
OBJDIR = ../obj/release
EXEFILE = $(PROGRAM)
...
endif

...

test.o : $(SRC)/test.c
$(CC) $(CFLAGS) -o $(OBJDIR)/test.o $(SRC)/test.c

...
=========================================

if, endif문이 Make내 문법과 맞는지 모르겠네요.(잊어버렸습니다.) 위의 방법을 응용하면 machine(sun, hp, linux 등등)별 컴파일도 처리할 수 있습니다. 업무에서 solaris, solaris 64bit, hp 마다 debug, release 모두를 처리하는 makefile을 만들어서 지금사용하고 있습니다.

이런 식으로 Makefile을 만들어 놓고 사용하는 사람이 있다는 정도로만 생각해 주세요.

...

saxboy의 이미지

ln -sf ../x86/Makefile ./Makefile.x86
ln -sf ../arm/Makefile ./Makefile.arm
for file *.c
do
ln -sf ../x86/{$file} $file
done

뭐 대충 이런 식이지요. 그리고 cd ../x86; make

나머지는 그냥 하는 작업과 똑같겠지요.

onemind555의 이미지

Quote:

debug:
CC = cc
CFLAGS = -g
OBJDIR = ../obj/debug
EXEFILE = $(PROGRAM).dbg
...

release:
CC = cc
CFLAGS = -O
OBJDIR = ../obj/release
EXEFILE = $(PROGRAM)

이런식으로 했을때 의존성 관계는 어떻게 지정 할 수 있나요... make dep를 하면 안 될것 같은데...

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

onemind555의 이미지

Quote:
aaa.o : ../dir/aaa.cpp

이런 식으로 되었을때 aaa.o 에 대해서 새로운 의존성을 추가 할 수 있나요??

Quote:
aaa.o : ../dir/aaa.h ../dir/bbb.h

이런식으로 뒤에 의존성이 더 붙으면 컴파일할때 두가지의 의존성을 살펴 보는 가요...???

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

fatman의 이미지

aaa.o : ../dir/aaa.h ../dir/bbb.h

Make는 의존성(?)을 검사하는 것이 아니라 그냥 ../dir/aaa.h와 ../dir/bbb.h의 시간을 검사해서 그 시간이 aaa.o가 만들어진 시간보다 뒤쪽일 경우 컴파일을 하고, 그렇지 않으면 compile하지 않는 것으로 알고 있습니다.

aaa.o : ../dir/aaa.h ../dir/bbb.h ../src/aaa.c

를 하면 ../dir/aaa.h, ../dir/bbb.h, ../src/aaa.c 중 하나라도 aaa.o보다 시간이 늦으면 다시 컴파일이 됩니다.

p.s 여러 사람이 여러 system에서 코드를 수정하고, 컴파일을 하다 보니 자주 clock skew가 발생하고 있습니다. 각 system 마다 시간이 조금씩 달라서 문제가 발생하는 것으로 보이는데, 마땅한 해결방법을 찾지 못하겠더군요.

p.s 혹시 제가 잘못이해하고 있으면 알려주세요...

...

onemind555의 이미지

처음에 손으로 쳐서 의존성을 제시 해줬는데...

나중에 make dep 명렬어로 #DO NOT DELETE 밑에도 의존성이 제시 되었을때 ...

손으로 쳐서 넣은 의존성과 make dep로 자동으로 들어간 의존성 이 생기게 되는데...

make를 호출 하면 두군데에서 설정된 의존성을 확인 하는 건가요...

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

jcly2의 이미지

앞서 설명하신 분처럼 Release버전과 Debug 버전 정의를 Makefile에 따로 만들어서 사용하는 것이 편하더군요.

아니면 환경 변수를 사용해서 이 환경 변수 조사후 Release버전을 만들지
Debug버전을 만들지 정의하는 것도 괜찮은 방법이죠..

eek의 이미지

제 같은 경우는
한 makefile로 만들구요
debug용 파일은 .o로 만들구요 Release용은 .oo 형식으로
만들구요 라이브러리는 libUtil.a (release) libUtil_debug.a(debug용)
이런 식으로 컴파일 되도록 하는데요 ^^;

Perl 만세~~~

onemind555의 이미지

.o .oo 따로 만드는건 확장자 규칙 사용 하면 될 것 같은데...

의존성 관계는 어떻게 설정 해줄 수 있나요.. 각각의 폴더 마다 makefile를 만들고 make dep를 재귀적으로 호출 되게 해야 하는 건가요??

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

fatman의 이미지

Quote:
제 같은 경우는
한 makefile로 만들구요
debug용 파일은 .o로 만들구요 Release용은 .oo 형식으로
만들구요 라이브러리는 libUtil.a (release) libUtil_debug.a(debug용)
이런 식으로 컴파일 되도록 하는데요 ^^;

gcc가 아닌 compiler를 사용한다면 object file 확장자가 .o로 고정되어 있어서 문제가 생길 수 있습니다. 예전에 공개 소스를 Solaris에 있는 cc로 컴파일하려고 하다가 object file의 확장자 문제로 고생을 했었습니다. cc는 -c option사용시 object file 확장자가 .o로만 고정되어서 결국 makefile을 수정해서 확장자별로 다른 디렉토리에 저장하도록 하였습니다.(바꿀 수 있는 방법을 여러가지로 찾아보다가 결국 찾지를 못했습니다.)

...

onemind555의 이미지

debug release폴더 만들어 makefile를 각각의 폴더에 넣는 것이 최고 낫겠군요.. vc의 nmake는 gnu툴처럼 의존성을 자동으로 구하는 방법도 존재 하지 않는 듯 하군요...

결국은 makefile생성 툴을 만들고 있습니다. 의존성도 지정 할수 있도록 약간의 파싱도 했구요.... 파싱이라 해봤자 40줄 정도 밖에 안 되지만...

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

댓글 달기

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