c++ - 使用 -flto 选项的 g++ 错误

标签 c++ boost linker g++

我正在尝试在 g++ 中启用链接时间优化。我的程序在没有 -flto 选项的情况下编译得很好。当我将它添加到我的 Makefile 时,目标文件编译时不会出现错误,例如

g++ main.cpp -I ../includes -std=c++0x -fopenmp -Wall -pedantic -Wno-vla -flto -D INFO_ -c -o .obj/main.o

但是当涉及到链接程序时:

g++ -fwhole-program -I ../includes -std=c++0x -fopenmp -Wall -pedantic -Wno-vla -flto -D INFO_ .obj/main.o .obj/atom.o .obj/bee.o .obj/colony.o ../includes/.obj/error.o ../includes/.obj/CmdLine.o ../includes/boost_lib_deb/libboost_program_options.a ../includes/gmp_lib_deb/lib/libgmpxx.a ../includes/gmp_lib_deb/lib/libgmp.a -o BeeBench

我收到很多这样的错误:

includes/gmp_lib_deb/lib/libgmpxx.a ../includes/gmp_lib_deb/lib/libgmp.a -o BeeBench
`typeinfo for boost::program_options::too_many_positional_options_error' referenced in section `.rodata._ZTVN5boost15program_options33too_many_positional_options_errorE[vtable for boost::program_options::too_many_positional_options_error]' of ../includes/boost_lib_deb/libboost_program_options.a(cmdline.o): defined in discarded section `.gnu.linkonce.t._ZTIN5boost15program_options33too_many_positional_options_errorE' of .obj/main.o (symbol from plugin)

`typeinfo for boost::program_options::too_many_positional_options_error' referenced in section `.rodata._ZTIN5boost16exception_detail19error_info_injectorINS_15program_options33too_many_positional_options_errorEEE[typeinfo for boost::exception_detail::error_info_injector<boost::program_options::too_many_positional_options_error>]' of ../includes/boost_lib_deb/libboost_program_options.a(cmdline.o): defined in discarded section `.gnu.linkonce.t._ZTIN5boost15program_options33too_many_positional_options_errorE' of .obj/main.o (symbol from plugin)
`typeinfo for boost::program_options::invalid_command_line_style' referenced in section `.rodata._ZTVN5boost15program_options26invalid_command_line_styleE[vtable for boost::program_options::invalid_command_line_style]' of ../includes/boost_lib_deb/libboost_program_options.a(cmdline.o): defined in discarded section `.gnu.linkonce.t._ZTIN5boost15program_options26invalid_command_line_styleE' of .obj/main.o (symbol from plugin)

我不知道出了什么问题。我使用 -flto 编译所有目标文件。这些库,即 Boost 和 GMP,在编译时没有 -flto 选项。这是导致错误吗? gcc 手册说可以混合使用 & 不带 -flto 选项编译的目标文件。还是我错过了其他东西,例如错误所说的这个插件是什么?

我在 Debian Wheezy 上使用 G++ 4.6.3。

更新:

按照评论中的建议,我做了一个最小的例子。我的测试程序的代码只有这样:

#include "boost/program_options.hpp"

int main ( int argC, char* argV[] )
{
    return 0;
}

当我编译它时:

g++ -o test -I ../includes -Wall -std=c++0x test.cpp -flto -fwhole-program -static

它给出了与上述类似的错误。如果我省略 -static、-flto 或 std=c++0x 选项,它编译时不会出错。 -fwhole-program 选项不会改变结果。我现在也用 G++ 4.7 测试过,同样的错误。

有什么建议吗?这真的是编译器错误,还是我仍然做错了什么?

最佳答案

由于我没有发现任何证据表明我的代码有问题,因此我发布了 Boost bugreport .它也被其他 boost 用户复制,因此我认为它实际上是 boost 或 g++ 中的一个错误。到目前为止,Boost 维护者没有任何回应。有的话我会更新这篇文章的。

更新

似乎是 g++ 链接器插件导致了问题(我仍然不知道为什么)。因此,一种可能的解决方法是使用 -fno-use-linker-plugin 禁用链接器插件。

关于c++ - 使用 -flto 选项的 g++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050140/

相关文章:

c++ - 如何在 C++ 中以非标准方式初始化动态内存?

c++ - 用模板重载现有函数是不好的做法吗?

c++ - 在禁用 MSVC 语言扩展的情况下使用 Boost.Thread header

c - 嵌入式系统中的内存冲突

Android 重启命令 - 谁调用reboot_main()?

linker - 如何链接特定库( g++; libstdc++.so.5 和 libstdc++.so.6 )

c++ - Flex C++ - #ifdef inside flex block

c++ - 在自定义堆栈分配器中释放内存

c++ - 冲突的 boost 版本

c++ - goroutines 和 boost.fiber 之间的区别