2014-04-16 3 views
0

다음 메이크 파일을 가지고 있지만 .so 파일이 아닌 .o 파일을 빌드하는 첫 번째 명령을 실행하기 만하면됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 명령 줄에서 다른 대상을 지정하지 않는 한메이크 파일이 끝까지 실행되지 않습니다

감사합니다,

SHELL = /bin/sh 
CC = gcc 
CFLAGS = -g -Wall 
LDFLAGS = -shared 

TARGET = Stepper.so 
SOURCES = $(shell echo ./*.c) 
HEADERS = $(shell echo ./*.h) 
OBJECTS = $(SOURCES:.c=.o) 
LIBS = liblua523.a 

PREFIX = $(DESTDIR)/usr/local 
BINDIR = $(PREFIX)/bin 

$(OBJECTS): $(SOURCES) $(HEADERS) 
    $(CC) $(CFLAGS) -c $(SOURCES) -o $(OBJECTS) 

$(TARGET): $(OBJECTS) 
    $(CC) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) 

clean: 
    rm $(OBJECTS) 
+0

'make Stepper.so'를 사용해 보셨습니까? –

+0

두 개의 전체 규칙'$ (OBJECT) :'와'$ (TARGET) :'을 교체하십시오. – Chnossos

답변

0

는 항상 메이크에서 발견 된 최초의 진정한 목표를 빌드합니다. 이 경우 첫 번째 실제 타겟이 첫 번째 오브젝트 파일이므로 모두 빌드 된 것입니다.

이 때문에 일반적으로 첫 번째 대상이 all 또는 그와 비슷한 메이크 파일이 표시됩니다.이 파일은 인자없이 "make"를 표준 호출하는 동안 빌드하려는 다른 여러 대상에 따라 달라집니다.

그러나 makefile은 여러 가지면에서 실제로 적절하지 않습니다. 사실, 모든 소스 파일을 가지고 있다는 것을 의미합니다. 1을 초과하면 실패합니다.

이 :

SOURCES = $(shell echo ./*.c) 

이 매우 효율적이지 않다; 여기에 와일드 카드를 사용해야합니다

SOURCES = $(wildcard ./*.c) 

이 규칙 :

$(OBJECTS): $(SOURCES) $(HEADERS) 
     $(CC) $(CFLAGS) -c $(SOURCES) -o $(OBJECTS) 

만들 지시를, "모든 오브젝트 파일에 대한 모든 소스 파일이나 헤더 파일이 변경된 경우, 다시 컴파일". 기본적으로 디렉토리에서 아무 것도 변경하지 않으면 모든 것이 다시 빌드됩니다. 원한다면 셸 스크립트를 작성하고 make를 전혀 신경 쓰지 않아도됩니다. 당신은> 1 소스 파일이있을 때 그것을 실행하려고하므로

또한, 컴파일러는 실패합니다 옳지 않다

gcc -g -Wall -c foo.c bar.c -o foo.o bar.o 

합니다.

이 규칙을 전혀 정의 할 필요가 없습니다. make에는 소스 파일에서 오브젝트 파일을 빌드하는 방법을 알고있는 내장 규칙이 있습니다.

$(OBJECTS): $(HEADERS) 

(제조법 없음) make는 개체가 헤더와 원본에 의존한다는 것을 알고 있습니다. 머리글이 바뀌면 모든 개체가 다시 작성되지만 간단한 프로그램에서는 문제가 없으므로 이상적이지 않습니다.

관련 문제