首页 文章

make:强制使用不同的编译器重新编译相同的对象

提问于
浏览
2

我希望我的makefile构建相同的二进制文件2次,首先用gcc编译然后用mingw编译 . 所以,我写了这个,但它不起作用:

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 $@ $< $(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 $@

$(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 $@

一旦编译对象用gcc目标PPS-Linux文件在$(OBJS),它试图 Build PPS-win32的与非常相同的对象文件,显然失败了,尽管我重新定义了CC和CFLAGS目标的事实PPS-win32的 . 这是输出:

$ 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 `_WinMain@16'
collect2: ld returned 1 exit status
make: *** [bin/pps-win32] Error 1

如何强制重新编译刚使用不同编译器编译的对象文件?

谢谢 .

2 回答

  • 1

    通过使对象文件也依赖于编译器,而不是试图用不同的内容覆盖相同的.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
    

    但我必须尝试它才能确定 .

  • 3

    我建议使用单独的 OBJ_DIRBIN_DIR 目录来完成此任务,其中名称部分来自编译器供应商:

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

    我使用类似的方法,它具有完全独立的构建目录和安装目录,其名称由以下构造:

    • 编译器供应商

    • 编译器版本

    • 架构

    • libc版本(如果linux)

    这导致名为(例如)的目录:

    • gcc_3.4.6-x86-libc_2.3.4

    • forte_5.10-x64

    • gcc_4.2.3-x86

相关问题