make: принудительная перекомпиляция одних и тех же объектов с другим компилятором - PullRequest
2 голосов
/ 30 января 2012

Я хочу, чтобы мой make-файл 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 $@

Как только он компилирует файл объектов в $ (OBJS) с gcc для целевого pps-linux, он пытается собрать 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 ]

3 голосов
/ 30 января 2012

Делая объектные файлы также зависимыми от компилятора, вместо того, чтобы пытаться перезаписать один и тот же файл .o на месте другим содержимым, например.

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

Примечание.Вы можете сделать это более аккуратно, просто используя целевое определение OBJ_DIR, то есть

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

, но я должен попробовать это, чтобы быть уверенным.

1 голос
/ 30 января 2012

Я бы предложил использовать для этого отдельные каталоги OBJ_DIR и BIN_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...