C++ 使用GCC';构建wxWidgets DLL时出错;Windows环境下的s链路时间优化

C++ 使用GCC';构建wxWidgets DLL时出错;Windows环境下的s链路时间优化,c++,compilation,linker,wxwidgets,mingw-w64,C++,Compilation,Linker,Wxwidgets,Mingw W64,尝试使用以下命令行构建wxWidgets 3.1.0库时: mingw32 make-f makefile.gcc BUILD=release SHARED=1 CFLAGS=“-O2-flto” CXXFLAGS=“-O2-flto”LDFLAGS=“-O2-flto” 我收到这个警告(31次) lto1.exe:警告:-目标忽略fPIC(所有代码与位置无关) 其次是: C:\Users\Marc\AppData\Local\Temp\ccEDEhIg.ltrans6.ltrans.o:但g

尝试使用以下命令行构建wxWidgets 3.1.0库时:

mingw32 make-f makefile.gcc BUILD=release SHARED=1 CFLAGS=“-O2-flto” CXXFLAGS=“-O2-flto”LDFLAGS=“-O2-flto”

我收到这个警告(31次)

lto1.exe:警告:-目标忽略fPIC(所有代码与位置无关)
其次是:

C:\Users\Marc\AppData\Local\Temp\ccEDEhIg.ltrans6.ltrans.o:但gcc.exe和g++.exe都无法识别它。阅读本文后:,我假设
-fwhopr
选项不再存在,现在是
-flto
开关的默认模式

  • 构建静态配置(
    SHARED=0
    )。它成功构建,但无法使用。见参考文献#1

  • 从LDFLAGS中省略
    -flto
    ,即仅在CFLAGS和CXXFLAGS中使用
    -flto
    。也无济于事


  • 如何克服这些错误,并使用GCC的链接时间优化构建wxWidgets?
    我正在用MinGW-w64建筑;线程模型Win32;异常处理;GCC版本5.3.0



    参考#1:来自“最小样本”生成命令行的结果

    H:\temp\wxwidgets-3.1.0\samples\minimal>mingw32 make-f makefile.gcc BUILD=release SHARED=0 CFLAGS=“-O2-flto”cxflags=“-O2-flto”LDFLAGS=“-O2-flto”LDFLAGS=“-O2-flto”
    windres--使用临时文件-i.././samples/sample.rc-ogcc\u mswu\minimal\u sample\u rc.o--定义WXMSW\uuuuu--定义NDEBUG--定义UNICODE--包含目录\..\\\..\lib\gcc\u lib\mswu--包含目录/../../include--包含目录--include dir./../../samples--定义NOPCH
    g++-c-o gcc\u mswu\minimal\u minimal.o-O2-mthreads-DHAVE\u W32API\u H-D\u WXMSW\u-DNDEBUG-D\u UNICODE-I.\..\lib\gcc\u lib\mswu-I.\..\n包括-W-Wall-I.\..\samples-DNOPCH-Wno-ctor dtor privacy-O2-flto-MTgcc\u mswu\minimal\mfu.o-gcc\mswu minimal.o-MD
    g++-o gcc\u mswu\minimal.exe gcc\u mswu\minimal\u sample\u rc.o gcc\u mswu\minimal\u minimal.o-mthreads-L.\..\\\\..\lib\gcc\u lib-Wl,--子系统,windows-mwindows-O2-flto-lwxmsw31u_core-lwxbase31u-LWxIFF-lwxjpeg-lwxpng-lwxzlib-LWxRegexus-lwxexpat-lkernel32-luser32-lwinspool-Lwinsm-Lwinsm-lshell32-lshlwapi-lcomctl32-lole32-loleaut32-luuid-lrpcrt4-ladvapi32-lversion-Lwinnet
    C:\Users\Marc\AppData\Local\Temp\ccY1ZbWs.ltrans0.ltrans.o:(.text+0x191):对“wxDefaultPosition”的未定义引用
    C:\Users\Marc\AppData\Local\Temp\ccY1ZbWs.ltrans0.ltrans.o:(.text+0x197):对“wxDefaultPosition”的未定义引用
    C:\Users\Marc\AppData\Local\Temp\ccY1ZbWs.ltrans0.ltrans.o:(.text+0x1a8):对“wxDefaultSize”的未定义引用
    (许多其他“未定义引用”错误-可能代码所依赖的每个函数都有一个错误)然后。。。
    collect2.exe:错误:ld返回了1个退出状态
    makefile.gcc:221:目标“gcc_mswu\minimal.exe”的配方失败
    mingw32 make:**[gcc\u mswu\minimal.exe]错误1
    
    我以前从未尝试过将LTO与DLL一起使用,但显然在使用过程中存在错误,请参见示例。不确定在您的情况下,使用建议的解决方法是否有帮助

    我认为应该立即将应用程序源代码和wxWidgets编译在一起,这类似于构建静态库,但不应该优化库中未使用的内容,而是应用程序代码中使用的内容


    最后,我真的不确定在wxWidgets的情况下,您是否能够通过LTO实现很多。库中没有太多需要优化的“慢”代码…

    我以前从未尝试过将LTO与DLL一起使用,但显然存在一些bug,请参见示例。不确定在您的情况下,使用建议的解决方法是否有帮助

    我认为应该立即将应用程序源代码和wxWidgets编译在一起,这类似于构建静态库,但不应该优化库中未使用的内容,而是应用程序代码中使用的内容


    最后,我真的不确定在wxWidgets的情况下,您是否能够通过LTO实现很多。库中没有太多需要优化的“慢”代码…

    感谢您在这方面的投入,VZ。我的目标实际上是通过一些自动化测试来对其进行基准测试。我会继续努力的。谢谢你在这方面的意见,VZ。我的目标实际上是通过一些自动化测试来对其进行基准测试。我会继续努力的。