2017-02-15 15 views
0

Я недавно получил become aware функции инкрементной компоновки gcc, и я хочу ее использовать. Дело в том, что я не пишу свой собственный Makefile - я использую CMake. Зависимости между файлами и целевые объекты по существу одинаковы, но я хочу, чтобы CMake попытался их получить, используя инкрементную привязку, а не ссылку с нуля?Могу ли я заставить CMake генерировать Makefile, используя gcc инкрементную привязку?

Кроме того, если это возможно, чтобы это даже для файлов, в библиотеках, то есть, когда вы перекомпилировать один .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

«Инкрементное связывание» - вы имеете в виду 'ld -r'? Это сильно отличается от того, что обычно называется добавочной связью в других компиляторах. Вы хотите использовать его для ускорения связи? Непонятно, как вы собираетесь это сделать, чтобы это помогло, если бы вы могли добавить пример Makefile с примером. – yugr

+0

Я имел в виду это в том смысле, о котором я спросил [этот вопрос] (http://stackoverflow.com/questions/42245133/is-it-possible-to-perform-differential-linking). Я добавлю образец Makefile. – einpoklum

ответ

1

Я недавно стало известно о дополнительных функции связующей ССАГПЗ в

Я думаю, что нам нужно уточнить некоторые термины. Инкрементные ссылки - это функция компоновщика, которая позволяет ускорить связывание, когда изменилось только небольшое подмножество объектных файлов. Это делается путем повторного использования результатов предыдущей ссылки.

GNU ld не имеет такой функции. То, что он может сделать, это перемещаемая ссылка, то есть объединение нескольких объектов в один. Если вы связываете и b.o с номером ab.o, а затем измените код a.o, он не сможет повторно использовать результаты перемещаемой ссылки, поэтому вам придется повторно связать ab.o с нуля (в отличие от честной инкрементной привязки).

Я хочу, чтобы CMake попытаться получить их с помощью инкрементного связывания, а не связывая с нуля

Я боюсь, что CMake (или любая другая система сборки) не обеспечивает поддержку этого в течение нескольких причины.

Прежде всего, в этом случае вам придется кэшировать результаты ld -r для всех возможных подмножеств ваших объектных файлов. Это число растет экспоненциально, что делает его не совсем практичным.

Во-вторых, есть больше ссылок на приложение, помимо ссылки на его объектные файлы: объединение библиотек, создание динамических разделов (PLT, перемещение и т. Д.), Релаксация и т. Д., Которые нужно будет делать с нуля каждый раз, даже если вам удастся использовать -r. Он может легко оказаться намного длиннее, чем просто связывать объектные файлы.