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

Sep 19, 2016 17:37

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

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

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

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

Leave a comment

Comments 13

kincajou September 19 2016, 15:55:18 UTC
--purge-the-unclean

*почти шутка*

есть какая-то опция линкера, которая выкидывает мёртвый код, но я её не помню ащще

Компилер компилирует не всё подряд, а только то, что ему скажут. Если используешь make, то он смотрит на время модификации файлов, включённых в проект - если они редактировались ПОСЛЕ последней сборки, они будут пересобраны в соответствии с описанными зависимостями.

Вроде ещё есть какой-то механизм автоматического разрешения зависимостей (как раз "отслеживая инклюды"), но я им не пользовался никогда

Reply


mbr September 19 2016, 16:41:43 UTC
Компилируется ровно то, что указано в Makefile. С gcc это никак не связано, поэтому сделать систему сборки "отслеживая цепочку #include" нельзя.

Сборка зависит от параметров линкера. Выбрасывание функций возможно, только если оно предварительно скомпилировано в отдельные секции для каждой процедуры. См. function-sections.

Reply

ex0_planet September 19 2016, 16:52:58 UTC
Да щас. -M специально придуман для интеграции с мейком.

Reply

mbr September 19 2016, 17:28:09 UTC
О как. Не знал.

Reply


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, 10:55:32 UTC
обычно при компиляции "один исходник = один объектник", в библиотеку можно запихнуть много объектников. при линковке объектник пихается целиком.

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

Reply

nicka_startcev September 20 2016, 14:14:32 UTC
и да, если злоупотреблять всякими темплейтиками, то ихняя имплементация окажется практически в каждой единице компиляции.

Reply


Leave a comment

Up