Я хочу поэкспериментировать с оптимизацией всей программы 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)





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)
@nornagon, s / должен быть / должен быть эквивалентен /
@AlexB Говорите по-английски. Что это вообще значит?
@Overv это синтаксис sed, то есть заменить "должно быть" на "должно быть эквивалентно"
@kranzky В вопросе четко сказано: «передать все C-файлы сразу во внешний интерфейс компилятора», как это не правильно?
извините @AlexB, я редактировал на основе ответа, который искал, когда искал решение в Google и нажимал на этот вопрос SO, когда он появился как результат №1 :(
Этот make-файл объясняется в stackoverflow.com/questions/3932895/makefile-aliases/…
SRCS=$(wildcard *.c)
OBJS=$(SRCS:.c=.o)
all: $(OBJS)
Мне кажется, что это не ответ на исходный вопрос, так как он, вероятно, будет делать много вызовов ${CC}. Тем не менее, это было то, чего я хотел для того, что пытался сделать. (У меня было преобразование, которое я хотел сделать для кучи текстовых файлов, поэтому я добавил свою собственную строку .SUFFIXES и тому подобное, но преобразование $(wildcard) и $(VARIABLE:.ext1=.ext2) было именно тем, что я искал.) Явно не голосовал ни за, ни за хотя я бы сказал, что это заслуживает отрицательного голосования на этот вопрос.
Вам нужно отказаться от правила суффикса (% .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 выше.
Читая документацию по этим флагам, я вижу заметки о времени ссылки а также оптимизация; вам тоже следует изучить их.
Почему это должен быть фактический список файлов C, а не подстановочные знаки?