Глюк воспроизводится так.
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?