2011-09-15 10 views
1

나는 내가 함께 연결해야하는 조립 및 C의 소스 코드의 혼합을메이크 대상

:-(내 메이크 파일에 문제가 있어요. 둘 다입니다. 두 종류의 서로 다른 빌드 지침이 필요 이것은 내가 지금 노력하고있어 종종 메이크

예에서 발견 % C 건설 :

모든 목록을 가져옵니다. 어셈블러 및 C 컴파일러 출력 * .o 인 파일, 나는 일반 %의 .o 인을 사용할 수 없습니다 C 파일 및 결과 출력 파일 :

C_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.c") 
C_OBJFILES := $(patsub %.c,%.o,$(C_SRCFILES)) 

모든 ASM 파일과 그 결과 출력 파일의 목록 가져 오기 : 나는 화면에 그 바르 에코 때

A_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.asm") 
A_OBJFILES := $(patsub %.asm,%.o,$(A_SRCFILES)) 

을, 그들은 올바른 것 같다,하지만 난 지금 내 목표를 정의하는 방법은?

나는 ...

어떤 제안이

$(A_OBJFILES): ($A_SRCFILES) 
    $(AS) $(AFLAGS) -o [email protected] $* 

$(C_OBJFILES): ($C_SRCFILES) 
    $(CC) $(CFLAGS) -c -o [email protected] $* 

all: $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $(A_OBJFILES) $(C_OBJFILES) -o $(TARGET_OUTPUT) 

하지만 당연히이 작동하지 않는 뭔가를 시도?

답변

4

첫 번째 문제 : 잘못 배치 된 괄호 또는 두 개입니다. 당신이 ($A_SRCFILES)( 내부 $

$(A_OBJFILES): ($A_SRCFILES) 

알 수 있습니다. Make는 $A을 확장합니다. 이것은 아무것도 아니며 일이 내리막 길입니다. 나는 당신이 $(A_SRCFILES)을 의미하고 다른 규칙에서 같은 것을 의미한다고 생각합니다.

두 번째 문제 : 나는 어셈블러의 문법을 모른다, 그러나 컴파일러 명령의 구문이 잘못 :

$(CC) $(CFLAGS) -c -o [email protected] $* 

우리는 패턴 규칙에하지 않으면 변수 $*은 아무것도 아니다, 우리는 아직 (아직) 아닙니다. 어쨌든 패턴 규칙에 따라 foo.o을 빌드하려고하면이 명령은 소스 파일 foo을 찾고 해당 파일은 없습니다. 이런 식으로 수행

$(CC) $(CFLAGS) -c -o [email protected] $< 

세 번째 문제 : 오브젝트 파일이 모든 소스 파일 (각 규칙)에 따라 달라집니다. 대신이 시도 :

$(A_OBJFILES): %.o : %.asm 
    ... 

$(C_OBJFILES): %.o : %.c 
    ... 

(지금는 패턴 규칙입니다.)

네 번째 문제 : 중복을 많이 마지막 규칙에. 이 그것을 변경 : 더 나은 여전히 ​​

all: $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $^ -o $(TARGET_OUTPUT) 

또는 :

all: $(TARGET_OUTPUT) 

$(TARGET_OUTPUT): $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $^ -o [email protected] 
+0

좋아, 지금은 제대로 작동을 가지고있다. 감사합니다 :-) –

+0

왜 그 대답을 받아들이지 않습니까? –

2

을 어셈블러 및 C 컴파일러 출력을 모두 * .o 인 파일, 나는 일반 %의 .o를 사용할 수 없기 때문에 %를.C 건설은 종종 당신이 할 수있는

물론 예를 들어 메이크 파일에서 발견 :

%.o : %.c 
    # commands to make .o from a corresponding .c 

%.o : %.asm 
    # commands to make .o from a corresponding .asm 
+0

콜론을 두 번 :'::'. http://www.gnu.org/software/make/manual/html_node/Double_002dColon.html – reinierpost

+1

더블 콜론은 필요 없습니다. –