Можно ли скомпилировать несколько целевых файлов с помощью компилятора CC?

Я использую Minix 2.0.4, поэтому не могу использовать gcc. Я хочу использовать один файл make для компиляции нескольких программ C с несколькими целями.

Вот текущее состояние моего Makefile

CFLAGS  = -D_POSIX_SOURCE
LDFLAGS =
CC      = cc
LD      = cc

PROG    = prog1 prog2 
OBJS    = prog1.o prog2.o

$(PROG): $(OBJS)
         $(LD) $(LDFLAGS) $(OBJS) -o $(PROG)

clean:
         rm -rf $(PROG) $(OBJS)

Однако, когда я пытаюсь использовать свой make-файл таким образом, я получаю сообщение об ошибке «prog2: не может скомпилировать, преобразование не применяется». Любые идеи о том, что я делаю неправильно?


person johns4ta    schedule 09.10.2013    source источник
comment
Я думаю, что уже ответил на этот вопрос здесь: stackoverflow.com/questions/19213584/   -  person Charlie Burns    schedule 09.10.2013
comment
Я попробовал это и сначала подумал, что это сработало, но он скомпилировал только первый набор программ. Он полностью игнорировал OBJ2 и PROG2.   -  person johns4ta    schedule 09.10.2013
comment
сделать тест будет сделать тест. make test2 сделает test2. Если вы хотите сделать, чтобы сделать и то, и другое, это другой вопрос.   -  person Charlie Burns    schedule 09.10.2013
comment
Да, если возможно, я хотел бы создать оба файла одновременно, выполнив только команду make. Это возможно?   -  person johns4ta    schedule 09.10.2013
comment
Да, смотрите все цели в ответе ниже. Без аргумента make просто создаст первую цель   -  person Charlie Burns    schedule 09.10.2013


Ответы (2)


Разделите его следующим образом:

PROG1 = test 
PROG2 = test2
OBJ1 = test.o
OBJ2 = test2.o


all: $(PROG1) $(PROG2)

$(PROG1): $(OBJ1) 
          $(LD) $(LDFLAGS) $(OBJ1) -o $(PROG1)
$(PROG2): $(OBJ2) 
          $(LD) $(LDFLAGS) $(OBJ2) -o $(PROG2)

и т.д

Если вся эта подстановка заставляет вас нервничать, вы можете проще сказать

all: test test1

test: test.o
      $(LD) $(LDFLAGS) test.o -o test
test2: test2.o
      $(LD) $(LDFLAGS) test2.o -o test2

И удалите это с самого начала:

PROG1 = test 
PROG2 = test2
OBJ1 = test.o
OBJ2 = test2.o

Есть и другие ярлыки, но этот более конкретный и очевидный.

person Charlie Burns    schedule 09.10.2013
comment
Большое спасибо за помощь еще раз. Я наткнулся на все: раньше, но предполагаю, что это было только в gcc. - person johns4ta; 09.10.2013
comment
В этом нет ничего особенного. Просто так случилось, что это первая цель в Makefile, поэтому make без аргументов делает это. - person Charlie Burns; 09.10.2013

Чтобы делать именно то, что вы просите, вам вообще не нужен Makefile. GNU Make имеет «встроенные правила» для того, что вам нужно:

> ls Makefile
ls: cannot access Makefile: No such file or directory
> make prog1 prog2
cc   prog1.o   -o prog1
cc   prog2.o   -o prog2

Кстати, в целом

> make prog1 prog2

немного отличается от наличия дополнительной цели all: prog1 prog2 и выполнения

> make all

Первый делает первую цель, а затем вторую, совершенно независимо, как бы в двух последовательных вызовах. Во-вторых, делает их за один вызов: вероятно, быстрее для больших make-файлов, возможно, параллельно, если вызывается с -j ..., и, возможно, с разными выводами сообщений.

person Mark Galeck    schedule 09.10.2013