Как условно включить ltcg, только если Qt был собран с ltcg?

Иногда проект qmake создается с использованием Qt, который был скомпилирован с помощью ltcg. Поскольку параметр сборки Qt ltcg не распространяется автоматически на проект, использующий данную установку Qt, компоновщик MSVC тратит время и выдает следующее предупреждение:

MSIL.netmodule или модуль, скомпилированный с /GL found; перезапуск ссылки с /LTCG; добавьте / LTCG в командную строку ссылки для улучшения производительности компоновщика

Есть ли способ условно включить ltcg для проекта, если в Qt, с которым он был собран, также был включен ltcg?

1 ответ

Оказывается, что параметры конфигурации, используемые для сборки каждого модуля Qt, сохраняются в QT.<module>.module_config, где <module> это имя модуля, например core,

Таким образом, учитывая, что каждый проект Qt использует core модуль, мы можем переслать опцию из этого модуля в наш файл проекта следующим образом:

contains(QT.core.module_config, ltcg) {
  CONFIG += ltcg
  msvc: QMAKE_LIBFLAGS *= /ltcg
}

QMAKE_LIBFLAGS опция отсутствует в системе конфигурации Qt - библиотекарь жалуется на отсутствие /ltcg так же, как делает компоновщик.

Следующий фрагмент использовался для поиска этих переменных:

for(var, $$list($$enumerate_vars())) {
    value = $$eval($$var)
    contains(value, ltcg): message($$var = $$value)
}
Другие вопросы по тегам