Makefiles - скомпилировать все файлы c одновременно

Я хочу поэкспериментировать с оптимизацией всей программы GCC. Для этого мне нужно передать все C-файлы сразу во внешний интерфейс компилятора. Однако я использую make-файлы для автоматизации процесса сборки, и я не эксперт, когда дело касается магии make-файлов.

Как мне изменить make-файл, если я хочу скомпилировать (возможно, даже связать), используя всего один вызов GCC?

Для справки - мой make-файл выглядит так:

LIBS  = -lkernel32 -luser32 -lgdi32 -lopengl32
CFLAGS = -Wall

OBJ = 64bitmath.o    \
      monotone.o     \
      node_sort.o    \
      planesweep.o   \
      triangulate.o  \
      prim_combine.o \
      welding.o      \
      test.o         \
      main.o

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

test: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
60
0
107 849
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

LIBS  = -lkernel32 -luser32 -lgdi32 -lopengl32
CFLAGS = -Wall

# Should be equivalent to your list of C files, if you don't build selectively
SRC=$(wildcard *.c)

test: $(SRC)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

Почему это должен быть фактический список файлов C, а не подстановочные знаки?

nornagon 28.06.2011 06:00

@nornagon, s / должен быть / должен быть эквивалентен /

Alex B 28.06.2011 06:02

@AlexB Говорите по-английски. Что это вообще значит?

Overv 14.07.2012 02:39

@Overv это синтаксис sed, то есть заменить "должно быть" на "должно быть эквивалентно"

kirb 19.07.2012 12:00

@kranzky В вопросе четко сказано: «передать все C-файлы сразу во внешний интерфейс компилятора», как это не правильно?

Alex B 16.05.2013 04:37

извините @AlexB, я редактировал на основе ответа, который искал, когда искал решение в Google и нажимал на этот вопрос SO, когда он появился как результат №1 :(

kranzky 16.05.2013 07:14

Этот make-файл объясняется в stackoverflow.com/questions/3932895/makefile-aliases/…

naught101 07.04.2014 16:33

SRCS=$(wildcard *.c)

OBJS=$(SRCS:.c=.o)

all: $(OBJS)

Мне кажется, что это не ответ на исходный вопрос, так как он, вероятно, будет делать много вызовов ${CC}. Тем не менее, это было то, чего я хотел для того, что пытался сделать. (У меня было преобразование, которое я хотел сделать для кучи текстовых файлов, поэтому я добавил свою собственную строку .SUFFIXES и тому подобное, но преобразование $(wildcard) и $(VARIABLE:.ext1=.ext2) было именно тем, что я искал.) Явно не голосовал ни за, ни за хотя я бы сказал, что это заслуживает отрицательного голосования на этот вопрос.

lindes 01.05.2015 00:26

Вам нужно отказаться от правила суффикса (% .o:% .c) в пользу правила большого взрыва. Что-то вроде этого:

LIBS  = -lkernel32 -luser32 -lgdi32 -lopengl32
CFLAGS = -Wall

OBJ = 64bitmath.o    \
      monotone.o     \
      node_sort.o    \
      planesweep.o   \
      triangulate.o  \
      prim_combine.o \
      welding.o      \
      test.o         \
      main.o

SRCS = $(OBJ:%.o=%.c)

test: $(SRCS)
    gcc -o $@  $(CFLAGS) $(LIBS) $(SRCS)

Если вы собираетесь поэкспериментировать с оптимизацией всей программы GCC, сделайте убедитесь, что вы добавили соответствующий флаг в CFLAGS выше.

Читая документацию по этим флагам, я вижу заметки о времени ссылки а также оптимизация; вам тоже следует изучить их.

Другие вопросы по теме