Я пытаюсь построить отладочную и выпускную версию библиотеки с помощью 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)
1-ая цель во всем (program_NAME_DEBUG) компилирует ОК, но второй (program_NAME_RELEASE) производит следующее сообщение об ошибке:
libGlam_rel.so
make: libGlam_rel.so: Command not found
make: *** [all] Error 127
libGlam_rel.so
является значением program_NAME_RELEASE
Это не похоже, признают 2-ю цель, так как она 1-го?
EDIT
наконец получил эту работу.
В одной проблеме были файлы src в нескольких каталогах, используется VPATH для сортировки, например.
# specify dirs other then current dir to search for src files
VPATH = ../../pulse_IO/src ../../../g2/src
В дополнение к дополнительным библиотечным целям в условное оборудование платформы, например.
# 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
добавлен новый отладки и выпуска объектных файлов:
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)
ad вычитал мои новые правила цели «все»:
.PHONY: all clean
all: $(program_DEBUG_NAME) $(program_RELEASE_NAME)
набор правил выглядит следующим образом (вкл. замена для создания неявного объектного файла):
$(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)
Это работает позволяет мне производить отладку и выпустить версии моя библиотека на платформах linux и windows с одним Makefile, например $ make -k
почему? Я думаю, что я правильно использую vpath здесь, то есть ищет источники * не * цели? – bph
его штраф за простой make-файл, и если это все, что вы собираетесь делать, то это нормально. вы столкнетесь с проблемами, если ваш проект начнет иметь файлы с одинаковыми именами, хотя разные пути – ThePosey
ah yes - я вижу, что это будет потенциальная проблема. – bph