Создание более общего make-файла - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий make-файл:

CC=gcc
CFLAGS= ---
LDFLAGS = ---

all: abc_test   
abc_test: abc_test.o defn_abc.o abc.o cmocka_compass.o
    $(CC) $(LDFLAGS) abc_test.o defn_abc.o abc.o cmocka_compass.o -o 
abc_test    
abc_test.o : abc_test.c 
    $(CC) $(CFLAGS) abc_test.c 
defn_abc.o : ../defn_abc.c
    $(CC) $(CFLAGS) ../defn_abc.c
abc.o : ../abc.c
    $(CC) $(CFLAGS) ../abc.c    
knownfile.o : ../../../../../knownpath.c 
    $(CC) $(CFLAGS) ../../../../../knownpath.c
clean: 
    rm *o *.log abc_test

, который будет работать (изменил имена некоторых файлов), но я хочу сделать его универсальным.Я попробовал следующее, но продолжаю получать сообщения об ошибках, так как нет целей.

CC=gcc
CFLAGS= ---
LDFLAGS = ---

SRCFILES := $(shell find ../ -name '*.c')
OBJFILES := $(patsubst %.c,%.o,%(SRCFILES))

OBJFILES: all
all: $(OBJFILES)

%.o: %.c
    $(CC) $(CFLAGS) %< -o %@

knownfile.o : knownpath.c 
    $(CC) $(CFLAGS) knownpath.c

файл make является тестовой папкой, которая содержит весь тестовый код (abs_test.c).Это также, где все объекты должны идти.Один каталог содержит файлы c defn_abc.c и abc.c.

Есть идеи, что я делаю неправильно?


ОБНОВЛЕНИЕ: Вот мой последний make-файл с ошибкой 'отсутствует разделитель'

CC=gcc
CFLAGS=-c -Wall -DUNIT_TESTING -DSYS_LINUX -Ipath1 -Ipath2
LDFLAGS = -Wl,---


SRCFILES := $(shell find ../ -name '*.c')
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))

all: $(PROG)

$(PROG): $(OBJFILES)
    $(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS)

all: $(OBJFILES)

%.o: %.c
    $(CC) $(CFLAGS) %< -o %@

knownfile.o : knownpath.c 
    $(CC) $(CFLAGS) knownfile.c

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Эта строка не делает то, что, по вашему мнению, делает:

OBJFILES: all

Или, по крайней мере, я предполагаю, что, хотя она в основном безвредна, она также бесполезна.Он объявляет, что target с именем 'OBJFILES' зависит от цели 'all'.Кроме того, это первая цель в файле, поэтому она является целью по умолчанию, но, поскольку «все» является ее предварительным условием, это приведет к тому, что цель «все» будет перестроена по умолчанию.Это именно то, что произошло бы, если бы вы вообще пропустили эту строку.Также обратите внимание, что это не имеет никакого отношения к переменной $(OBJFILES).

Ваша основная проблема заключается в том, что вы используете неправильный синтаксис для большинства ссылок на переменные.Значения переменных с многосимвольными именами получают через выражения вида $(VAR) или ${VAR}, , а не %(var).Скобки / фигурные скобки могут быть опущены для односимвольных имен.Я советую вам отдавать предпочтение форме с круглыми скобками над формой с фигурными скобками, особенно в командах в рецептах, поскольку последнюю легко спутать с синтаксисом оболочки.

0 голосов
/ 30 мая 2018

Я бы порекомендовал вам прочитать об основах Makefile.Это полезная ссылка intro на makefile

Переменная OBJFILES перезаписывается последовательными строками в представленном примере.Я подозреваю, что удаление строки

OBJFILES: all

и использование patsubst в качестве

$(patsubst %suffix,%replacement,$(var))

может помочь.

@ edit:Поскольку теперь вы спросили, как использовать LDFLAGS и избавиться от ошибки «отсутствует разделитель», вот несколько советов.

  • Цель LDFLAGS - использовать для предоставления флагов времени ссылкикомпилятор, когда все объектные файлы связаны, чтобы сделать финальный исполняемый файл.Они могут выглядеть следующим образом:
all: $(PROG)

$(PROG): $(OBJFILES)
    $(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS)
  • Ошибка ' отсутствует разделитель ' исправлена ​​вставкой вкладок вместо пробела в началестрока, описывающая действие / рецепт к правилу.Снова откройте Makefile в редакторе, удалите пробелы перед строками ниже и замените на tab .. стрелка, которую я использую для отображения вкладки
---->$(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS)

---->$(CC) $(CFLAGS) %< -o %@

---->$(CC) $(CFLAGS) knownfile.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...