ed9*_*d95 6 c++ windows llvm clang
我在Windows上使用MinGW构建了Clang,目标是三倍x86_64-w64-windows-gnu.可执行文件clang.exe和clang ++.exe按预期工作,如果我在发布模式下构建它们(它们编译程序没有错误),但是当在调试模式下构建时我无法运行它们并得到此错误 - "此应用程序无法运行你的电脑".来自同一版本的其他可执行文件(如clang-check.exe)不会显示此错误并正确运行.
似乎这可能是文件大小的问题,因为clang.exe和clang ++.exe的大小都超过2GB,而其他可执行文件较小但我的印象是64位Windows上的文件大小限制是4GB.
还有其他人遇到过类似的问题吗?如果文件大小有问题,是否可以让LLVM将调试符号放在单独的文件中以减小可执行文件的大小?
编辑:我试图通过在构建LLVM时使用-gsplit-dwarf标志将调试符号转储到单独的文件来减少可执行文件大小,但它没有任何效果.
是的,文件大小是解决这个问题的一个很好的暗示.所述IMAGE_OPTIONAL_HEADER64.SizeOfImage字段是一个DWORD,表明4 GB最大大小.但是还有另外一个限制,OS加载器将整个.exe或.dll文件映射到内存中,并带有内存映射文件.MMF上的视图永远不会超过2 GB.这是一个很难的技术限制,它甚至适用于x64.在这篇文章中更多关于这个问题.
调试信息无疑是图像文件爆炸的原因.相比之下,VS2017附带的clang构建需要27MB用于前端,32MB用于x64后端.从这个项目页面可以看到为什么-gsplit-dwarf无法解决您的问题:
Fission在GCC 4.7中实现,需要最近版本的objcopy和gold链接器的支持.
MinGW无法为您提供金链接器.他们没有试图移植它,因为它只能生成ELF图像.冷酷的事实,只要你依赖MinGW,那么你就没有一个好的划桨了.
需要一些激烈的东西.我会犹豫地提到Cygwin.考虑另一个编译器,比如使用Clang构建Clang :)或MSVC++.社区版是免费下载的.另外一定要看看Clang端口,他们做了很多工作才能使它兼容ABI.