在使用大小优化(-Os)编译boost_regex时出现“重复部分”错误

时间:2013-01-06 10:45:35

标签: boost mingw compiler-optimization

编译器:http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev6.7z

提升:http://sourceforge.net/projects/boost/files/boost/1.52.0/boost_1_52_0.7z

(均在D:驱动器上)

boost_regex汇编为:

b2 --prefix=D:\boost toolset=gcc --with-regex --layout=tagged release

代码:

#include <boost\regex.hpp>
int main() {
  boost::regex reg("[a-z]+");
}

使用参数编译:

g++ -I "d:\boost" -Os -o test.exe test.cpp -static -L d:\boost\stage\lib -lboost_regex-mt

错误:

d:\boost\stage\lib\libboost_regex-mt.a(regex.o): duplicate section `.rdata$_ZTVN5boost16exception_detail19error_info_injectorISt13runtime_errorEE[__ZTVN5boost16exception_detail19error_info_injectorISt13runtime_errorEE]' has different size
d:\boost\stage\lib\libboost_regex-mt.a(regex.o): duplicate section `.rdata$_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorISt13runtime_errorEEEE[__ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorISt13runtime_errorEEEE]' has different size
d:\boost\stage\lib\libboost_regex-mt.a(regex.o): duplicate section `.rdata$_ZTSN5boost16exception_detail10clone_implINS0_19error_info_injectorISt13runtime_errorEEEE[__ZTSN5boost16exception_detail10clone_implINS0_19error_info_injectorISt13runtime_errorEEEE]' has different size
d:\boost\stage\lib\libboost_regex-mt.a(regex.o): duplicate section `.rdata$_ZTSN5boost16exception_detail10clone_baseE[__ZTSN5boost16exception_detail10clone_baseE]' has different size
d:\boost\stage\lib\libboost_regex-mt.a(regex.o): duplicate section `.rdata$_ZTSN5boost16exception_detail19error_info_injectorISt13runtime_errorEE[__ZTSN5boost16exception_detail19error_info_injectorISt13runtime_errorEE]' has different size

它编译好了,但我还没有测试它是否适用于更复杂的代码。删除-Os开关可以清除错误,但应用程序大小会大2倍。

也许我也应该使用大小优化来构建Boost,但我不知道在b2命令行中将该选项传递到何处。

3 个答案:

答案 0 :(得分:15)

在我的情况下,boost 1.58在内部使用“-march = i686”进行编译,但我的代码却没有。在我的项目中添加“-march = i686”可以摆脱所有“重复部分”。

吸取的教训:始终确保所有库和主项目都使用相同的编译器选项进行编译。

答案 1 :(得分:2)

我相信这是一个编译错误。我的解决方法是添加-fno-tree-vectorize

答案 2 :(得分:0)

我在编译代码时遇到同样的错误,使用gcc-4.9.1在MinGW32中使用了一个使用gcc-4.4.7作为编译器的lib。而且我也用ccache来加速,ccache也是个问题。删除〜/ .ccache /中的缓存并重新编译然后我解决这个问题。