2012-01-30 140 views
2

我想讓我的makefile建立相同的二進制文件2次,先用gcc編譯然後用mingw編譯。所以,我寫這一點,但它不工作:make:用不同的編譯器強制重新編譯相同的對象

OBJ_DIR = obj 
SRC_DIR = src 
BIN_DIR = bin 

INCLUDE = -I./$(SRC_DIR) 
LIBS = 

_SRCS = print_current_dir.c test_main.c 
_OBJS = print_current_dir.o test_main.o 

SRCS = $(addprefix $(SRC_DIR)/,$(_SRCS)) 
OBJS = $(addprefix $(OBJ_DIR)/,$(_OBJS)) 

all: $(BIN_DIR)/pps-linux $(BIN_DIR)/pps-win32 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

$(BIN_DIR)/pps-linux: CC = cc 
$(BIN_DIR)/pps-linux: CFLAGS = -g -Wall $(INCLUDE) $(LIBS) 
$(BIN_DIR)/pps-linux: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o [email protected] 

$(BIN_DIR)/pps-win32: CC = i586-mingw32msvc-cc 
$(BIN_DIR)/pps-win32: CFLAGS = -g -Wall $(INCLUDE) $(LIBS) 
$(BIN_DIR)/pps-win32: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o [email protected] 

一旦編譯對象用gcc目標PPS-Linux文件在$(OBJS),它試圖打造PPS-win32的與非常相同的對象文件,明顯失敗,儘管我重新定義了目標pps-win32的CC和CFLAGS。 這裏是輸出:

$ make 
cc -c -o obj/print_current_dir.o src/print_current_dir.c -g -Wall -I./src 
cc -c -o obj/test_main.o src/test_main.c -g -Wall -I./src 
cc -g -Wall -I./src obj/print_current_dir.o obj/test_main.o -o bin/pps-linux 
i586-mingw32msvc-cc -g -Wall -I./src obj/print_current_dir.o obj/test_main.o -o bin/pps-win32 
obj/print_current_dir.o: In function `print_dir': 
/home/matteo/Desktop/pps/src/print_dir.c:23: undefined reference to `get_current_dir_name' 
/home/matteo/Desktop/pps/src/print_dir.c:25: undefined reference to `puts' 
/home/matteo/Desktop/pps/src/print_dir.c:27: undefined reference to `free' 
/usr/lib/gcc/i586-mingw32msvc/4.4.4/../../../../i586-mingw32msvc/lib/libmingw32.a(main.o):(.text+0x85): undefined reference to `[email protected]' 
collect2: ld returned 1 exit status 
make: *** [bin/pps-win32] Error 1 

如何強制對象的重新編譯的文件只是用不同的編譯器編譯的?

謝謝。

回答

3

通過使對象文件也依賴於編譯器,而不是嘗試用不同的內容覆蓋相同的.o文件,例如。

LINUX_OBJS = $(addprefix $(LINUX_OBJ_DIR)/,$(_OBJS)) 
... 
$(BIN_DIR)/pps-linux: $(LINUX_OBJS) 

NB。您可以通過只使用的OBJ_DIR與目標相關的定義,即做多整齊,

$(BIN_DIR)/pps-linux: OBJ_DIR = linux-obj 

,但我不得不嘗試是肯定的。

1

我會建議使用獨立OBJ_DIRBIN_DIR目錄來實現這一點,在部的結構從編譯器供應商名稱:

OBJ_DIR = obj-$(CC) 
BIN_DIR = bin-$(CC) 

我使用了完全不同的編譯目錄類似的方法,以及安裝目錄,名稱從構造:

  • 編譯器供應商
  • 編譯器版本
  • 架構
  • libc的版本(如果Linux)的

這導致命名(例如)目錄:

  • gcc_3.4.6 86 libc_2.3.4
  • forte_5.10- x64
  • gcc_4.2.3-x86
相關問題