问题标签 [link-time-optimization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
175 浏览

c++ - 为什么链接时优化会导致分段错误?

我在使用arguments构建的Windows上使用Mingw-w64 v7 和g++ 10.2 。我已经从这里下载并解压了bzip2 1.0.6:https ://sourceforge.net/projects/bzip2/ 。现在我在MSys2控制台中像这样构建boost 1.76.0 :--mode=gcc-10.2.0 --arch=x86_64 --buildroot=/c/mingw-builds/BuildRoot --update-sources --exceptions=seh --threads=posix --enable-languages=c++ --jobs=48 --rt-version=v7

我想使用Boost.Iostreamsbzip2压缩一些流。因此,我创建了一个包含以下内容的测试文件 main.cpp:

如果我编译它

在Msys2控制台上设置路径

运行它,我得到

现在,如果我从目录中删除目录bin.v2并再次构建boost,但这次是这样的:InstallReleaseboost_1_76_0cflags=-flto

再次运行main.exe,我得到:

如果我改用的话,情况并非如此boost::iostreams::zlib_(de)compressor。如果我用这样的调试信息构建提升:

main.exegdb中运行,输出如下:

尝试打印回溯是不成功的,即使main.exe已使用参数编译-O0 -g

这意味着什么?链接时优化没有我想象的那么有害吗?错误在哪里?在编译器中?在Boost.Iostreams 中?我犯了错误吗?哪一个?或者我怎样才能弄清楚究竟是什么导致了分段错误?

0 投票
2 回答
57 浏览

c++ - 前向声明是否完全消除了对指针类型的任何#include 的需要?

假设我们有一个源文件 A.cpp,我们在其中转发声明了一个类型 ClassB,然后我们继续使用指向 ClassB 的指针,而没有 #include 文件 B.cpp(其中定义了 ClassB);在 B.cpp 中,我们转发声明 ClassA 并使用指向它的指针,而无需 #include A.cpp (其中定义了 ClassA),那么编译器对此是否完全满意?符号解析能正常工作吗?换句话说,这两个目标文件在链接时间之前是否根本不需要相互了解?

(我假设在 Visual Studio 上编译 C++ 代码而不对默认编译器进行任何更改)

PS:

文件 A.cpp

文件 B.cpp