@Mercury13
Программист на «си с крестами» и не только

Qt + MinGW + LTO + LLD: как заставить их работать вместе?

Глюк воспроизводится так.
1. Установить MSYS (MinGW и LLD), Qt (любой версии) под Windows.
2. Собрать собственный комплект из компилятора от MSYS и любой версии Qt из дистрибутива.
3. Построить пустой проект на Qt Widgets. Добавить к нему…
QMAKE_CXXFLAGS += -flto
QMAKE_LFLAGS += -flto -fuse-ld=lld

При линковке не находит функцию qMain.

Хорошо, пишем такое…
# Special LTO features for main.cpp
CONFIG(release, debug|release) {
        win32|win64 {
            FAT_SOURCES = main1.cpp

            fat.name = FAT_SOURCES
            fat.dependency_type = TYPE_C
            fat.variable_out = OBJECTS
            fat.input = FAT_SOURCES
            fat.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
            fat.commands = $${QMAKE_CXX} $(CXXFLAGS) $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} -ffat-lto-objects

            QMAKE_EXTRA_COMPILERS += fat
    }
}

(в файле main1.cpp простой include main.cpp)

Тогда не находит функций, которые вызываются из этого main.cpp.

Если бахнуть всему проекту -ffat-lto-objects, всё работает… за исключением того самого LTO. По размеру скомпилированного EXE’шника видно, что никто его не оптимизировал.

__attribute__ ((used)) ничего не даёт.

Что делать? Как сказать этому самому LTO, что «точка входа» — qMain, а не main?
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
К сожалению, я прошу невозможное. И связано это с архитектурой оптимизации при линковке GCC. Дело в том, что сам LD вызывает оптимизатор, и очень, блин, жаль. Ведь у LLVM другое устройство виртуальной машины, которая делает оптимизацию при линковке.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы