使用mingw-w64工具链时,在发布模式下链接Regex Boost库时会出现“重复的部分具有不同的大小”警告。

11

当我在发布模式下链接我的项目时,我收到以下警告:

myProject-libs/release/libboost_regex-mt-s-1.50.0.a(cpp_regex_traits.o): duplicate section `.data$_ZZN5boost16cpp_regex_traitsIcE21get_catalog_name_instEvE6s_name[boost::cpp_regex_traits<char>::get_catalog_name_inst()::s_name]' has different size

我怀疑问题的原因可能是boost库使用的编译选项与我的项目不同,但我不知道如何找到这些差异(boost在构建过程中没有输出这些选项)。

为了在Ubuntu 12.04上编译win32版本的boost库,我使用了以下步骤:

tar jxf boost_1_50_0.tar.bz2
cd boost_1_50_0
./bootstrap.sh
echo "using gcc : 4.6 : i686-w64-mingw32-g++ : <rc>i686-w64-mingw32-windres <archiver>i686-w64-mingw32-ar ;" > user-config.jam
./bjam toolset=gcc target-os=windows --address-model=32 variant=release threading=multi threadapi=win32 link=static runtime-link=static --prefix=/opt/boost_1_50_0-release-static-windows-32 --user-config=user-config.jam -j 10 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install

为了编译我的项目中的文件,我使用类似以下的命令:

i686-w64-mingw32-g++ -march=corei7 -mfpmath=sse -m32 -Wall -fmessage-length=0 -I"/opt/boost_1_50_0-release-static-windows-32/include" -std=c++0x -O3 -g0 -DNDEBUG -I"myProject/src/cpp" -c -o myProject/build/release/src/cpp/myproject.o myproject/src/cpp/myproject.cpp

我的测试表明正则表达式运行良好,但我仍想解决警告问题。

编辑

我发现可以使用 bjam 的 cxxflags= 参数添加额外的编译器选项。

例如: bjam cxxflags='-fPIC' ....

也许确保传递给项目的参数与我所做的相同,可以解决问题(特别是与优化相关的参数,如链接的问题中建议的那样)。


1
你在Linux上用那条命令行这么顺利地编译了boost库?!上次我试过,花费了好几个小时。我会为你的问题点赞,只是基于这个原因。 - dsign
1
这并不是我自己写的,只是从已经被遗忘的页面上复制粘贴而来,但在成千上万的零散技巧和窍门中找到如此简洁优美的代码也花费了我很长时间。 - David L.
4
我也在Windows 7 64位系统上使用mingw-w64(gcc 4.7.1,boost 1.51.0)时遇到了这个“问题”,但在使用mingw(gcc 4.7.0)时没有遇到。也许这是mingw-w64的问题? - user573335
1
问题也出现在mingw上(gcc版本4.8.3(x86_64-posix-seh-rev0,由MinGW-W64项目构建))。所有TUs都使用相同的选项编译,并被“ar”合并成一个“.a”文件,但是当“.a”与其他“.o”文件链接时,就会出现类似的错误。库“.a”在内部几乎不使用Boost.Spirit - Tomilov Anatoliy
https://dev59.com/ZWYq5IYBdhLWcg3wzDvk#24233374 - Lorenzo Pistone
2个回答

3

您的编译器使用了不同的选项进行编译 :) 在Linux上编译库,在Windows上编译程序会导致一个相同名称的.data段,但它们的大小不同。理论上这可能很有趣,因为数据段是可写的,但实际上,这不应该有影响。除非有证据表明这会引起我不知道的问题,否则您可以安全地忽略该警告;但我不知道如何使其消失。


3
过去我可能使用了略微不同版本的编译器,但现在我确定 Boost 是使用与项目相同的编译器进行编译的,但我仍然收到警告。 - David L.
我发现,如果在同一个编译器下,将项目的某些部分使用 -Os 进行编译,而其他部分则不进行优化,则会触发此问题。 - gabry

0

最近我在使用mingw编译boost for Windows时遇到了这个问题(即链接器警告“重复的部分大小不同”)。

我的问题是,我用-std=c++14编译了我的应用程序,但在编译boost时我没有明确提供方言标志(对于g++ 5.3.0,默认为-std=c++98)。在编译boost时添加方言标志-std=c++14解决了我的问题。请参见此answer以了解如何设置编译boost时的cxxflags。

我相信我的解决方案可能适用于您(您的应用程序是使用-std=c++0x编译的,但未提供任何方言标志)。虽然我晚了6年,但我会将我的答案留在这里,供其他遇到此问题的人参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接