2011-04-25 6 views
0

저는 makefile에 매우 새로운 점이 있습니다. 내가 전에했던 가장 복잡한 작업은 이미 설계된 makefile에 새로운 .h 및 .cpp 또는 .c를 포함시키는 것이 었습니다.어떻게 메이크 파일에서 동적으로 개체 파일의 이름을 바꿉니다

Visual Studio에서 gcc로 프로젝트의 컴파일 과정을 이식해야하며 이미 동료가 작성한 솔루션이 있지만 솔루션을 컴파일하기 위해 4 개의 bash 스크립트와 makefile을 사용했습니다.

대신에 유지 관리가 쉬운 솔루션을 찾고있었습니다. 내 질문은 아주 어리 석고 인정할 수도 있지만 어디서나 찾을 수는 없으며 모든 것을 제대로 이해할 수있었습니다. 아래의 대상에서

:

$(OBJECTS): %.o: %.cpp 
    $(CC) $(CPPFLAGS) -c $< -o [email protected] 

내가 .o 만이 존재 이미 생성되는 경우 테스트하고 다른 뭔가로 이름을 변경하고 싶습니다. 이것은 프로젝트에서 동일한 이름을 가지고 있지만 내용이 다른 여러 소스 파일이 있기 때문에 필요합니다.

예를 들어 컴파일중인 현재 .cpp 파일 이름이 file.cpp이고 생성 될 개체가 file.o 인 경우 규칙은 file.o가 이미 있는지 테스트하고 현재 file.o의 이름을 변경해야합니다 그밖에.

이 설명이 포함 된 훌륭한 튜토리얼을 알고 있다면 알려 주시기 바랍니다. 나는 그 규칙에 의해 컴파일되는 현재 파일에 대한 테스트를 만드는 방법을 보여주는 많은 예제를 발견했지만 오브젝트 .o의 이름을 바꿀만한 예제는 발견하지 못했습니다.

미리 감사드립니다. 여기에 쓰여지는 "멍청이"에 ​​대해 사과드립니다. :-)

+0

이전에 수행 한 작업은 소스 파일과 동일한 디렉토리 계층에 객체 파일을 배치하는 것입니다. 나는 같은 이름의 다른 레벨에 파일을 가지고 있다고 생각하니? – Max

+0

@Max, 예. file1.cpp file2.cpp와 같은 이름의 소스 파일이있는 두 개의 다른 디렉토리가 있습니다. – zlogdan

답변

1

우선, 당신은 깊은 동정심을 가지고 있습니다.

Make는 실제로 그러한 모호성을 처리하도록 설계되지 않았기 때문에 kludge를 사용해야합니다. 파일 이름을 ~으로 변경하지 않으 셨으므로 file.ofile_save.o으로 이동하십시오. 질문에 대한 내 의견의

# This tells Make that these are not real targets, so that it will 
# proceed even if file.o already exists. 
.PHONY: $(OBJECTS) 

$(OBJECTS): %.o: %.cpp 
    # If file.o exists, move it to file_save.o 
    @if [ -f [email protected] ]; then mv [email protected] $*_save.o; fi 
    $(CC) $(CPPFLAGS) -c $< -o [email protected] 
+0

안녕하세요, 많은 감사드립니다. 이 코드는 작동하는 것처럼 보이지만 * _save.o 파일은 생성되지 않습니다.나는 내 소스 cpp 파일이 변수'SOURCE = file1.cpp file2.cpp file1.cpp'에 정의되어 있고 OBJECTS 규칙을 만들기 위해'OBJECTS = $ (SOURCES : .cpp = .o)'를 사용했기 때문에 그런 것 같아요. . – zlogdan

+0

정말요? 그건 중요하지 않아 ...'if' 행을 이것으로 바꾸면 무슨 일이 일어나는 지 알 수있다 :'mv $ @ $ * _ save.o'. 처음에는'file.o '를 움직일 필요가 없을 때 불평 할 것이지만, 그렇지 않으면 똑같은 일을하고 그것이 무엇을하고 있는지를 알려줄 것입니다. – Beta

+0

도움을 주셔서 감사합니다! 내가 그것을 시도 할 때, make는 컴파일을 abort한다. – zlogdan

1

확장 :

은 아마도 당신은 이름 충돌을 방지하기 위해, 소스 파일과 같은 디렉토리 hieryarchy에서 오브젝트 파일을 배치하는 것이 좋습니다.

그래서 src/network/client.cpp는/obj/network/client.o를 빌드하도록 컴파일됩니다. 이 메이크에 관해서

나는 매우 녹슨 해요하지만 난 같은 수행하여 것을 해결 믿는다 : 다음 잊어 버린 이후

$SRC= src/network/client.cpp src/main.cpp ..... 
$OBJ= makefile_replace_function($SRC, .o) 

$(OBJ) : $(SRC) 
    compile_instructions 

을 당신이 그들의 실제 등가물에 makefile_replace_functioncompile_instructions를 교체해야합니다 경우 ...

나는 이것이 매우 도움이되지 않을지도 모르지만 적어도 고려해야 할 아이디어라는 것을 알고 있습니다.

관련 문제