Makefileを使用してライブラリのデバッグおよびリリースバージョンをビルドし、それらのライブラリを関連するビルドディレクトリにコピーしようとしています。
.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)は正常にコンパイルされますが、2番目のターゲット(program_NAME_RELEASE)は次のエラーを生成します。
libGlam_rel.so
make: libGlam_rel.so: Command not found
make: *** [all] Error 127
libGlam_rel.so
の値ですprogram_NAME_RELEASE
1番目のターゲットとは異なり、2番目のターゲットを認識していないようです。
編集
ついにこれが機能するようになりました。
1つの問題は、複数のディレクトリに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)
新しいルールを「すべて」のターゲットに追加しました。
.PHONY: all clean
all: $(program_DEBUG_NAME) $(program_RELEASE_NAME)
ルールセットは次のようになります(暗黙的なオブジェクトファイル生成の置き換えを含む):
$(program_DEBUG_NAME): $(DEBUG_OBJS)
$(DEBUG_LINK.c) -shared -Wl,-soname,$@ $^ -o $(BUILD_DIR)/debug/$@
$(program_RELEASE_NAME): $(RELEASE_OBJS)
$(RELEASE_LINK.c) -shared -Wl,-soname,$@ $^ -o $(BUILD_DIR)/release/$@
# rule to build object files (replaces implicit rule)
$(BUILD_DIR)/debug/%.o: %.c
$(DEBUG_LINK.c) $< -c -o $@
$(BUILD_DIR)/release/%.o: %.c
$(RELEASE_LINK.c) $< -c -o $@
最後に、すべての新しいファイルを処理するようにクリーンに変更しました。
clean:
@- $(RM) $(BUILD_DIR)/debug/$(program_DEBUG_NAME)
@- $(RM) $(DEBUG_OBJS)
@- $(RM) $(BUILD_DIR)/release/$(program_RELEASE_NAME)
@- $(RM) $(RELEASE_OBJS)
これにより、単一のMakefileを使用してLinuxおよびWindowsプラットフォーム全体でライブラリのデバッグバージョンとリリースバージョンを作成できます。$ make -k