Несколько файлов в качестве аргументов, чтобы сделать.Мой подход в порядке? - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь создать универсальный make-файл для своих лабораторных задач.Есть пять задач, и каждая требует отдельного файла C, скомпилированного и запущенного.Поскольку я должен включить некоторые дополнительные библиотеки при использовании gcc, я хотел бы просто набрать make ZAD=first second и скомпилировать first.c и second.c.Проблема в том, что я не знаю, как правильно перебирать список ZAD в make-файле.Я могу разделить задачи в цикле for, но не могу принудительно ввести символ новой строки в этом цикле.Этот пример объяснит лучше (ниже мой make-файл):

ZAD = first second

main: $(foreach dir, $(ZAD), $(dir).o) 
    $(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir))
    $(foreach dir, $(ZAD), rm $(dir).o)

first.o: first.c
    gcc -Wall -c first.c

second.o: second.c
    gcc -Wall -c second.c

Вот что я получаю, когда, например, пытаюсь скомпилировать только second.c:

wojtasskorcz@wojtek-laptop:~/mownit/lab1dom$ make ZAD=second
gcc -Wall -c second.c
gcc second.o -lgsl -lgslcblas -lm -o second
rm second.o

И все хорошо, но когда я пытаюсь скомпилировать first.c и second.c за один раз, вот что происходит:

wojtasskorcz@wojtek-laptop:~/mownit/lab1dom$ make ZAD='first second'
gcc first.o -lgsl -lgslcblas -lm -o first  gcc second.o -lgsl -lgslcblas -lm -o second
gcc: error: gcc: No such file or directory
make: *** [main] Error 1

Я пришел к выводу, что это потому, что во втором foreach в makefile нет новой строкиперсонаж.Но я понятия не имею, как вставить его туда.Или, может быть, есть другой подход к этой проблеме?

РЕДАКТИРОВАТЬ:
Проблема решена с помощью бета-версии, хотя я нашел еще один способ здесь

Итак, мой отредактированный make-файлвыглядит так:

define \n


endef

ZAD = first second

main: $(foreach dir, $(ZAD), $(dir).o)
    $(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir)${\n})
    $(foreach dir, $(ZAD), rm $(dir).o${\n})

%.o: %c
    gcc -Wall -c %.c

Теперь все работает так, как задумано.И еще раз спасибо Бета за ваш ответ.

1 Ответ

3 голосов
/ 08 марта 2012

Это должно сделать это:

%: %.o
    gcc $^ -lgsl -lgslcblas -lm -o $@

%.o: %.c
    gcc -Wall -c $< -o $@

Вызвать его make -r first second.

Первое правило гласит: "построить something из something.o". Второй говорит: "построить something.o из something.c". -r в вызове говорит "не используйте встроенные правила" (поскольку есть встроенное правило для построения something из something.c, которое будет иметь приоритет над первым правилом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...