【发布时间】:2021-03-12 12:46:46
【问题描述】:
我正在尝试在 Windows 上使用 mingw-w64 编译器调试我的可执行版本,并注意到以下情况:当您编译大量使用模板的大型源文件时,您可能会收到 File too big/too many sections 错误。解决方案是添加选项-Wa,-mbig-obj。但是,如果我这样做,我会收到以下错误:
{standard input}: Assembler messages:
{standard input}: Fatal error: can't close myexe.exe.p/src_session.cpp.obj: file too big
据我所知,在 windows 上使用 mingw-w64 编译器构建如此大的可执行文件时存在某些限制(当然,出于调试目的,在发布模式下没有问题)。
我想出了一些关于如何解决这个问题的想法,但在我描述它们之前,请注意我的项目结构
.
├── src
| └── session.cpp
├── include
| ├── scope.hpp
│ └── session.hpp
├── subprojects
│ ├── somesubproject
│ └── anothersubproject
└── meson.build
简单地说,我的项目涉及一些模板化程度很高的子项目,我认为这会导致这里出现问题(例如这个 MQTT 存储库https://github.com/redboltz/mqtt_cpp)。我根本不需要我的子项目的任何调试信息,我只需要我自己的文件session.hpp, session.hpp, session.cpp 的调试信息。是否可以只为某些文件打开调试信息,即除了子项目之外的所有文件?
有效的解决方法是在等效的 archlinux docker 容器上编译和调试我的项目吗?我会在 Linux 上遇到同样的问题吗?
该项目使用-Og 标志毫不费力地编译,但这不是我想要的,因为编译优化了很多有趣的东西。
在这里你可以找到我使用的编译器指令
[1/4] "C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include"
"-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common" "-I..\subprojects\alosa1_common\include"
"-I..\subprojects\hana\include" "-I..\subprojects\mqtt_cpp\include"
"-I..\subprojects\tomlplusplus\include" "-I..\subprojects\pybind11\include"
"-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include"
"-IC:/msys64/mingw64/include/python3.8" "-fdiagnostics-color=always" "-pipe" "-D_FILE_OFFSET_BITS=64"
"-std=c++17" "-g" "-Wa,-mbig-obj" "-DBOOST_ALL_NO_LIB" "-pthread" "-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT"
"-MD" "-MQ" alosaclient.exe.p/mqtt_pch.hpp.gch "-MF" "alosaclient.exe.p\mqtt_pch.hpp.gch.d"
-o alosaclient.exe.p/mqtt_pch.hpp.gch "-c" ../pch/mqtt_pch.hpp
[2/4] "C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include"
"-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common"
"-I..\subprojects\alosa1_common\include" "-I..\subprojects\hana\include"
"-I..\subprojects\mqtt_cpp\include"
"-I..\subprojects\tomlplusplus\include" "-I..\subprojects\pybind11\include"
"-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include" "-IC:/msys64/mingw64/include/python3.8" "-fdiagnostics-color=always" "-pipe" "-D_FILE_OFFSET_BITS=64" "-std=c++17" "-g" "-Wa,-mbig-obj"
"-DBOOST_ALL_NO_LIB" "-pthread" "-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT" "-fpch-preprocess" "-include" "mqtt_pch.hpp" -MD -MQ alosaclient.exe.p/subprojects_alosa1_common_src_common_crc32.cpp.obj
-MF "alosaclient.exe.p\subprojects_alosa1_common_src_common_crc32.cpp.obj.d"
-o alosaclient.exe.p/subprojects_alosa1_common_src_common_crc32.cpp.obj "-c" ../subprojects/alosa1_common/src/common/crc32.cpp
[3/4] "C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include"
"-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common"
"-I..\subprojects\alosa1_common\include" "-I..\subprojects\hana\include"
"-I..\subprojects\mqtt_cpp\include" "-I..\subprojects\tomlplusplus\include"
"-I..\subprojects\pybind11\include" "-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include"
"-IC:/msys64/mingw64/include/python3.8" "-fdiagnostics-color=always" "-pipe" "-D_FILE_OFFSET_BITS=64"
"-std=c++17" "-g" "-Wa,-mbig-obj" "-DBOOST_ALL_NO_LIB" "-pthread"
"-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT" "-fpch-preprocess"
"-include" "mqtt_pch.hpp" -MD -MQ alosaclient.exe.p/src_session.cpp.obj
-MF "alosaclient.exe.p\src_session.cpp.obj.d" -o alosaclient.exe.p/src_session.cpp.obj "-c" ../src/session.cpp
FAILED: alosaclient.exe.p/src_session.cpp.obj
"C:\msys64\mingw64\bin\g++" "-Ialosaclient.exe.p" "-I." "-I.." "-I..\include" "-Isubprojects\alosa1_common" "-I..\subprojects\alosa1_common" "-I..\subprojects\alosa1_common\include" "-I..\subprojects\hana\include" "-I..\subprojects\mqtt_cpp\include" "-I..\subprojects\tomlplusplus\include" "-I..\subprojects\pybind11\include" "-I..\subprojects\spdlog\include" "-IC:/msys64/mingw64/include" "-IC:/msys64/mingw64/include/python3.8"
"-fdiagnostics-color=always" "-pipe"
"-D_FILE_OFFSET_BITS=64" "-std=c++17" "-g" "-Wa,-mbig-obj"
"-DBOOST_ALL_NO_LIB" "-pthread" "-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT"
"-fpch-preprocess" "-include" "mqtt_pch.hpp"
-MD -MQ alosaclient.exe.p/src_session.cpp.obj -MF "alosaclient.exe.p\src_session.cpp.obj.d" -o alosaclient.exe.p/src_session.cpp.obj "-c" ../src/session.cpp
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/bin/as.exe: alosaclient.exe.p/src_session.cpp.obj: section .pdata$_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_St8functionIFbhhEEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE5beginEv: string table overflow at offset 10000080
{standard input}: Assembler messages:
{standard input}: Fatal error: can't close alosaclient.exe.p/src_session.cpp.obj: file too big
ninja: build stopped: subcommand failed.
【问题讨论】:
-
> 有效的解决方法是在等效的 archlinux docker 容器上编译和调试我的项目吗?我想这是特定于平台的问题。所以在archlinux上调试程序将是一个解决方案。我在我的 Arch linux(不是 docker)上调试 mqtt_cpp 没有任何问题。 > 我会在 Linux 上遇到同样的问题吗?我不这么认为。