Haa*_*hii 15 c++ linker boost 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
Run Code Online (Sandbox Code Playgroud)
但是当谈到链接程序时:
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
Run Code Online (Sandbox Code Playgroud)
我收到很多这样的错误:
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)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚出了什么问题.我使用编译所有目标文件-flto.libs,即Boost和GMP,编译时没有-flto选项.这会导致错误吗?gcc手册说可以混合使用&without -flto选项编译的目标文件.或者我错过了其他的东西,例如错误所说的插件是什么?
我在Debian Wheezy上使用G ++ 4.6.3.
更新:
正如评论中所建议的那样,我做了一个最小的例子.我的测试程序的代码只有这样:
#include "boost/program_options.hpp"
int main ( int argC, char* argV[] )
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用它编译时:
g++ -o test -I ../includes -Wall -std=c++0x test.cpp -flto -fwhole-program -static
Run Code Online (Sandbox Code Playgroud)
它给出了如上所述的类似错误.如果省略-static,-flto OR std = c ++ 0x选项,则编译时没有错误.-fwhole-program选项不会更改结果.我现在也测试了G ++ 4.7,同样的错误.
有什么建议?这真的是编译器错误,还是我还在做错什么?
Haa*_*hii 13
由于我没有找到任何证据,我的代码有问题,我发布了一个Boost bug报告.它也被其他boost用户复制,因此我认为它实际上是boost或g ++中的一个bug.到目前为止,Boost维护者没有回应.如果有的话,我会更新这篇文章.
更新
似乎g ++链接器插件导致了问题(我仍然不知道为什么).因此,可能的解决方法是使用禁用链接器插件-fno-use-linker-plugin.