Sep 19, 2016 17:37
Помогаете мне тут... Добрые вы :)
Подскажите, как сделать так (в make, наверное?), чтобы оно компилировало не все подряд, а только то, что реально используется - отслеживая цепочку #include?
И вдогонку - линкер тупо собирает обьектники или же берез только те функции, которые реально используются? Или если не выбрасывает ненужное, то как это
Вопрос,
Программизмы
Leave a comment
Comments 13
*почти шутка*
есть какая-то опция линкера, которая выкидывает мёртвый код, но я её не помню ащще
Компилер компилирует не всё подряд, а только то, что ему скажут. Если используешь make, то он смотрит на время модификации файлов, включённых в проект - если они редактировались ПОСЛЕ последней сборки, они будут пересобраны в соответствии с описанными зависимостями.
Вроде ещё есть какой-то механизм автоматического разрешения зависимостей (как раз "отслеживая инклюды"), но я им не пользовался никогда
Reply
Сборка зависит от параметров линкера. Выбрасывание функций возможно, только если оно предварительно скомпилировано в отдельные секции для каждой процедуры. См. function-sections.
Reply
Reply
Reply
SOURCES := $(wildcard *.c)
deps: $(SOURCES:.c=.d)
%.d: %.c
gcc -M $(CFLAGS) $< $^
-include *.d
По второму вопросу - линкер работает на уровне отдельных секций (если не включено lto), поэтому -ffunction-sections и что-то еще кажется надо линкеру, кажется -gc-sections.
Reply
C_FLAGS += -fdata-sections -ffunction-sections
LDFLAGS += -Wl,--gc-sections
Впрочем все легко гуглится.
Еще вариант - можно настроить QT Creator, чтобы там все компилировать/редактировать. Если в проекте будет хотябы мегабайт исходников - поиск по ним важен очень.
Reply
а может ли мэйк удалить лишнее?
то есть, можно ли задать правило, что файл А мешает сборке файла Б и перед сборкой Б надо _удалить_ файл А?
Reply
Reply
если же пихать каждую функцию в свою секцию, то при линковке будут выкинуты лишние секции. но тут надо с умом подходить, ибо инлайн и прочие хитрости оптимизации (типа 2 похожих функции слить в одну) ломаются при "каждой функции секцию"
Reply
Reply
Leave a comment