在发布模式下链接我的项目时,我收到以下警告:
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 =参数添加boost编译器的其他选项。
实施例: bjam cxxflags =' - fPIC'....
也许确保将与我所做的相同的参数传递给项目可以解决问题(特别是与链接问题中建议的优化相关的参数)。
答案 0 :(得分:3)
您的编译器使用不同的选项进行编译:)在Linux上编译库和Windows上的程序会导致存在同名的.data段,但它们的大小不同。从理论上讲,这可能很有趣,因为数据段是可写的,但在实践中,它应该无关紧要。除非有证据表明这导致了我不知道的问题,否则你可以安全地压制这个警告;不过,我不知道你是怎么让它消失的。
答案 1 :(得分:0)
我最近在尝试使用mingw为Windows编译boost时遇到了此问题(即链接器警告“重复节的大小不同”)。
我遇到的问题是我用-std=c++14
编译了我的应用程序,但是在编译boost时,我没有特别提供方言标志(对于g ++ 5.3.0,默认设置为-std=c++98
)。在编译boost时添加方言标志-std=c++14
对我来说解决了这个问题。有关在编译boost时如何设置cxxflag的说明,请参见此answer。
我相信我的解决方案可能对您有用(您的应用程序是用-std=c++0x
编译的,但是没有提供任何方言标志来增强)。尽管我已经晚了6年,但我会将答案留给碰巧发现此问题的其他人。