Мне не удалось собрать общую библиотеку для Windows x86-64, используя MinGW-W64 с -flto
, Вот что я получаю (компиляция выполняется на Linux-коробке):
# ...
x86_64-w64-mingw32-g++ -c -std=gnu++11 -fvisibility=hidden -DGLEW_STATIC -Ofast -flto -frtti -pedantic -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_LARGEFILE_SUPPORT -I. -I'include' -I'/usr/x86_64-w64-mingw32/share/qt4/mkspecs/win32-g++-cross-x64' -o build/Point3D.o src/Point3D.cpp
x86_64-w64-mingw32-g++ -mwindows -Ofast -flto -shared -Wl,-subsystem,windows -mthreads -Wl,--out-implib,lib/libglengine.a -o lib/glengine.dll object_script.glengine.Release -lopengl32 -Wl,-Bstatic -lturbojpeg -lpng -lwebpdecoder
Cannot export _ZNSt6vectorI6StringSaIS0_EE19_M_emplace_back_auxIJRKS0_EEEvDpOT_: symbol wrong type (4 vs 3)
Cannot export _ZNSt6vectorIPN3GLE6ShaderESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_: symbol wrong type (4 vs 3)
Cannot export _ZNSt6vectorIPN3GLE7ProgramESaIS2_EE19_M_emplace_back_auxIJRKS2_EEEvDpOT_: symbol wrong type (4 vs 3)
collect2: error: ld returned 1 exit status
Makefile.Release:211: recipe for target 'lib/glengine.dll' failed
Прекрасно компилируется для Linux с LTO и без него, а также для Windows без LTO.
Эти символы относятся к:
void std::vector<String, std::allocator<String> >::_M_emplace_back_aux<String const&>(String const&)
void std::vector<GLE::Shader*, std::allocator<GLE::Shader*> >::_M_emplace_back_aux<GLE::Shader* const&>(GLE::Shader* const&)
void std::vector<GLE::Program*, std::allocator<GLE::Program*> >::_M_emplace_back_aux<GLE::Program* const&>(GLE::Program* const&)
То есть каждый раз, когда я использую std::vector
,
Я столкнулся с той же проблемой.
Что помогло мне добавить -fno-use-linker-plugin
на флаги компоновщика.
-fno-use-linker-plugin
вызывает оптимизацию lto в gcc, а не в компоновщике + плагине компоновщика gcc.