Могу ли я получить CMake для генерации Makefile-ов с использованием инкрементальной компоновки gcc?
Недавно я узнал о функции инкрементальной компоновки в gcc, и я хочу использовать ее. Дело в том, что я не пишу свой собственный Makefile - я использую CMake. Межфайловые зависимости и цели по сути одинаковы, но я хочу, чтобы CMake пытался получить их, используя инкрементные ссылки, а не ссылки с нуля?
Более того, если это возможно, даже для файлов внутри библиотек, т.е. при перекомпиляции .o
в пределах .a
файл, а не весь этот файл будет пересмотрен при связывании исполняемого файла, только один .o
внутри него пересматривается / повторно применяется.
Для иллюстрации предположим, что мой CMakeLists.txt
имеет:
add_executable(
foo
a.cpp
b.cpp
c.cpp
)
Прямо сейчас, когда a.cpp
изменения, мы получаем компиляцию a.cpp
-> a.o
тогда обычная связь a.o b.o c.o
-> foo
, Я хочу чтобы это было a.o foo something_else_maybe -> foo
Примечание. Этот вопрос не о MSVC и его собственных возможностях инкрементного связывания.
1 ответ
Недавно я узнал о функции инкрементальной компоновки в gcc
Я думаю, что мы должны уточнить некоторые условия. Инкрементные ссылки - это функция компоновщика, которая позволяет ускорить создание ссылок, когда изменилось только небольшое подмножество объектных файлов. Это делается путем повторного использования результатов предыдущей ссылки.
У GNU ld такой функции нет. Он может перемещать ссылку, т.е. объединять несколько объектов в один. Если вы ссылку a.o
а также b.o
в ab.o
а затем изменить a.o
, он не сможет повторно использовать результаты перемещаемой ссылки, поэтому вам придется повторно связать ab.o
с нуля (в отличие от честных добавочных ссылок).
Я хочу, чтобы CMake пытался получить их, используя инкрементные ссылки, а не ссылки с нуля
Я боюсь, что CMake (или любая другая система сборки) не обеспечивает поддержку по нескольким причинам.
Прежде всего в этом случае вам придется кэшировать результаты ld -r
для всех возможных подмножеств ваших объектных файлов. Это число растет в геометрической прогрессии, что делает его не совсем практичным.
Во-вторых, помимо связывания его объектных файлов есть еще кое-что: связывание библиотек, генерация динамических разделов (PLT, перемещения и т. Д.), Расслабление и т. Д., Которые придется выполнять каждый раз с нуля, даже если вы каким-то образом умудриться использовать -r
, Это может легко оказаться намного дольше, чем просто связывание объектных файлов.