2014-11-27 2 views
0

Я пытаюсь написать make-файл для компиляции 87 файлов со следующими именами: file1.c, file2.c file3.c .... file87.cнаписание Makefile компилировать несколько бинарных файлов

я пытаюсь для компиляции их в отдельные двоичные файлы с именами: file1, file2, file3 .... file87

В Makefile Мне нужно определить следующие переменные для каждого из них. Это то, что я изначально.

FILE1 = file1 
$(FILE1)_SRC := \ 
     mydir/file1.c \ 
     mydir/another.c 

$(FILE1)_CFLAGS := `pkg-config --cflags glib-2.0` 
$(FILE1)_LDFLAGS := -L. `pkg-config --libs glib-2.0` 

FILE2 = file2 
$(FILE2)_SRC := \ 
     mydir/file2.c \ 
     mydir/another.c 

$(FILE2)_CFLAGS := `pkg-config --cflags glib-2.0` 
$(FILE2)_LDFLAGS := -L. `pkg-config --libs glib-2.0` 

Также в конце Makefile мне нужно хранить имена исполняемых файлов

binaries = $(FILE1) $(FILE2) ...... $(FILE87) 

Я разведанных петли и определить директиву сделать, но я не могу понять, как я могу сделать это аккуратно в не громоздкий способ. Обратите внимание, что CFLAGS и LDFLAGS одинаковы для всех из них.

Любые входы или альтернативные подходы к написанию файла Makefile очень приветствуются.

Я написал это на основе ответа Селдона ниже, но это дает ошибку:

SRCS = $(wildcard mydir/*.c) 
TGTS = $(SRCS:%.c=%) 

CFLAGS = $$(pkg-config --cflags glib-2.0) 
LDFLAGS = -L. 
LDLIBS = $$(pkg-config --libs glib-2.0) 

all: $(TGTS) 
    @echo $(SRCS) 
    @echo $(TGTS) 

$(TGTS) : % : %.o another.o 

#clean: 
# rm -f $(TGTS) *.o 

#.PHONY: all clean 

$ make 
cc $(pkg-config --cflags glib-2.0) -c -o mydir/another.o mydir/another.c 
make: *** No rule to make target `another.o', needed by `mydir/another'. Stop. 

Источник:

another.c

# include <stdio.h> 
# include <stdlib.h> 

void print_string(const char * file_name, int lineno, const char * func_name) { 

    printf("%s %d %s\n", file_name, lineno, func_name); 

} 

file01.c

int main() { 

    print_string(__FILE__, __LINE__, __func__); 
} 

Любая помощь приветствуется.

+0

Что вам нужно 'binaries' для? – Beta

+0

@ Бета, мне нужно их построить. Благодарю. – abc

+0

Прочтите ошибку! Это _make_ жалуется, что вы не сказали, как построить 'another.o'. Затем посмотрите на Makefile. Единственная строка, в которой отображается 'another.o', - это статическое правило шаблона' $ (TGTS):%:% .o another.o'. Если каждая цель в '$ {TGTS}' не зависит от 'another.o', то вытащите ее! (просто зависимость, а не вся строка!) – bobbogo

ответ

2

Если переменные являются одинаковыми для всех программ, вы можете использовать статическое шаблонное правило так:

SRCS = $(wildcard file*.c) 
TGTS = $(SRCS:%.c=%) 

CFLAGS = $$(pkg-config --cflags glib-2.0) 
LDFLAGS = -L. 
LDLIBS = $$(pkg-config --libs glib-2.0) 

all: $(TGTS) 

$(TGTS) : % : %.o another.o 

clean: 
    rm -f $(TGTS) *.o 

.PHONY: all clean 
+0

Я попробую это, спасибо. – abc

+0

Можете ли вы взглянуть на ошибку, пожалуйста? Я также разместил источники. Благодарю. – abc

+0

Статические правила шаблонов, безусловно, путь, Yay! (Действительно, не нравится вызов _wildcard_, хотя, Boo!) – bobbogo

Смежные вопросы