Очередные вопросы знакокам GCC

Sep 19, 2016 17:37

Помогаете мне тут... Добрые вы :)

Подскажите, как сделать так (в make, наверное?), чтобы оно компилировало не все подряд, а только то, что реально используется - отслеживая цепочку #include?

И вдогонку - линкер тупо собирает обьектники или же берез только те функции, которые реально используются? Или если не выбрасывает ненужное, то как это

Вопрос, Программизмы

Leave a comment

ex0_planet September 19 2016, 16:52:27 UTC
По первому вопросу - надо сначала сгенерить депендсы ключом -M (с теми же CFLAGS ессно), потом их включить в Makefile. Примерно так:

SOURCES := $(wildcard *.c)

deps: $(SOURCES:.c=.d)

%.d: %.c
gcc -M $(CFLAGS) $< $^

-include *.d

По второму вопросу - линкер работает на уровне отдельных секций (если не включено lto), поэтому -ffunction-sections и что-то еще кажется надо линкеру, кажется -gc-sections.

Reply

balmerdx September 19 2016, 22:08:30 UTC
Если точнее, для линковки только тех функций и данных, что используются в программе.
C_FLAGS += -fdata-sections -ffunction-sections
LDFLAGS += -Wl,--gc-sections
Впрочем все легко гуглится.

Еще вариант - можно настроить QT Creator, чтобы там все компилировать/редактировать. Если в проекте будет хотябы мегабайт исходников - поиск по ним важен очень.

Reply

nicka_startcev September 20 2016, 17:31:23 UTC
о, кстати, вопрос про мэйк возник хитрый: мэйк, типично, создает что-то нужное, для чего нужно что-то еще и так далее по цепочке.

а может ли мэйк удалить лишнее?
то есть, можно ли задать правило, что файл А мешает сборке файла Б и перед сборкой Б надо _удалить_ файл А?

Reply

ex0_planet September 20 2016, 17:33:26 UTC
Там есть опция НЕ удалять intermediate targets. Я думаю что если начать сносить файлы, имеющие отношение к вычисляемым в данный момент целям, он сойдет с ума.

Reply

nicka_startcev September 20 2016, 17:34:59 UTC
не, это совсем другое.
я именно про явное указание взаимоисключающих целей

Reply

ex0_planet September 20 2016, 17:36:44 UTC
Опять не понял

Если хочется просто очищать сборочный каталог перед тем как, то это просто:

.PHONY: rebuild-all clean build

rebuild-all: clean build

clean:
rm -rf $(EVERYTHING)
rm -rf builddir/

rebuild: target.exe doc.html ...

Reply

nicka_startcev September 20 2016, 18:35:07 UTC
такой метод знаю, да.

Reply


Leave a comment

Up