Makefile을 사용하여 라이브러리의 디버그 및 릴리스 버전을 빌드하고 해당 라이브러리를 관련 빌드 디렉토리에 복사하려고합니다.'all'에 여러 대상 만들기
.PHONY: all clean distclean
all: $(program_NAME_DEBUG)
$(CP) $(program_NAME_DEBUG) $(BUILD_DIR)/debug/$(program_NAME_DEBUG)
$(RM) $(program_NAME_DEBUG)
$(RM) $(program_OBJS)
$(program_NAME_RELEASE)
$(CP) $(program_NAME_RELEASE) $(BUILD_DIR)/release/$(program_NAME_RELEASE)
$(RM) $(program_NAME_RELEASE)
$(RM) $(program_OBJS)
$(program_NAME_DEBUG): $(program_OBJS)
$(LINK_DEBUG.c) -shared -Wl,-soname,$(program_NAME_DEBUG) $(program_OBJS) -o $(program_NAME_DEBUG)
$(program_NAME_RELEASE): $(program_OBJS)
$(LINK_RELEASE.c) -shared -Wl,-soname,$(program_NAME_RELEASE) $(program_OBJS) -o $(program_NAME_RELEASE)
모든 (program_NAME_DEBUG)의 1 차 목표는 OK 컴파일하지만 2 일 (program_NAME_RELEASE는) 다음과 같은 오류 발생 : 그것은하지 않습니다 program_NAME_RELEASE
의 값이
libGlam_rel.so
make: libGlam_rel.so: Command not found
make: *** [all] Error 127
libGlam_rel.so
입니다 제 1 목표대로 제 2 목표를 인식하고있는 것처럼 보입니까?
편집은 마지막으로이 작업을 얻었다.
하나의 문제가 여러 개의 디렉토리에 src 파일이있는 경우 VPATH를 사용하여이를 분류합니다 (예 :
# specify dirs other then current dir to search for src files
VPATH = ../../pulse_IO/src ../../../g2/src
플랫폼 조건부 항목에 추가 라이브러리 타겟에 추가되었습니다.
DEBUG_OBJS := $(addprefix $(BUILD_DIR)/debug/,${program_OBJS})
RELEASE_OBJS := $(addprefix $(BUILD_DIR)/release/,${program_OBJS})
내 디버깅을 설정하고 해제 CFLAGS :
DEBUG_CFLAGS := -fPIC -g -Wall -DDEBUG=1
RELEASE_CFLAGS := -fPIC -O2 -Wall -DDEBUG=0
모든 디버그를 대조 및 공개 컴파일러 옵션 :
DEBUG_LINK.c := $(CC) $(DEBUG_CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
RELEASE_LINK.c := $(CC) $(RELEASE_CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
# Platform specific conditional compilation
UNAME := $(shell uname)
TARGET := Glam
ifeq ($(UNAME), Linux)
# LINUX version
program_NAME := lib$(TARGET).so
program_DEBUG_NAME := lib$(TARGET)_dbg.so
program_RELEASE_NAME := lib$(TARGET)_rel.so
BUILD_DIR = ../build/linux
endif
ifeq ($(UNAME), MINGW32_NT-6.1)
# WINDOWS version
program_NAME := lib$(TARGET).dll
program_DEBUG_NAME := lib$(TARGET)_dbg.dll
program_RELEASE_NAME := lib$(TARGET)_rel.dll
BUILD_DIR = ../build/windows
endif
는 오브젝트 파일을 새로운 디버그를 추가 해제 광고 내 모든 규칙을 '모든'목표에 적용하십시오.
.PHONY: all clean
all: $(program_DEBUG_NAME) $(program_RELEASE_NAME)
규칙 세트는 다음과 같습니다 (inc. 암시 적 오브젝트 파일 생성을위한 대체) :
$(program_DEBUG_NAME): $(DEBUG_OBJS)
$(DEBUG_LINK.c) -shared -Wl,-soname,[email protected] $^ -o $(BUILD_DIR)/debug/[email protected]
$(program_RELEASE_NAME): $(RELEASE_OBJS)
$(RELEASE_LINK.c) -shared -Wl,-soname,[email protected] $^ -o $(BUILD_DIR)/release/[email protected]
# rule to build object files (replaces implicit rule)
$(BUILD_DIR)/debug/%.o: %.c
$(DEBUG_LINK.c) $< -c -o [email protected]
$(BUILD_DIR)/release/%.o: %.c
$(RELEASE_LINK.c) $< -c -o [email protected]
나는 모든 새 파일을 다룰 깨끗한 수정 마무리 할 :
clean:
@- $(RM) $(BUILD_DIR)/debug/$(program_DEBUG_NAME)
@- $(RM) $(DEBUG_OBJS)
@- $(RM) $(BUILD_DIR)/release/$(program_RELEASE_NAME)
@- $(RM) $(RELEASE_OBJS)
이 날 디버그를 생산하고 버전을 출시 할 수 있도록 작동 하나의 Makefile로 리눅스와 윈도우 플랫폼의 라이브러리 $ make -k
이유는 무엇입니까? 여기서 vpath를 올바르게 사용하고 있다고 생각합니다. 즉 소스가 아닌 * 타겟을 검색하고 있습니까? – bph
간단한 메이크 파일에 대한 괜찮아요. 프로젝트가 동일한 경로의 이름을 가진 파일을 가지고 시작하면 문제가 발생할 것입니다. – ThePosey
아 - 그렇습니다. 잠재적 인 문제가 될 수 있습니다. – bph