Я получил ошибки "дублирования раздела" при компиляции boost_regex с оптимизацией размера (-Os)

компилятор: 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

boost: 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 устраняет ошибку, но размер приложения больше 2x.

Возможно, мне тоже нужно создать Boost с оптимизацией размера, но я не знаю, куда передать эту опцию в командной строке b2.

Ответ 1

В моем случае boost 1.58 внутренне компилировался с помощью "-march = i686", но мой код не был. Добавление "-march = i686" в мой проект избавилось от "дублированного раздела".

извлеченный урок: всегда старательно старайтесь, чтобы все библиотеки и основной проект были скомпилированы с одинаковыми параметрами компилятора.

Ответ 2

Я считаю, что это ошибка компилятора. Обходной путь в моем случае состоял в том, чтобы добавить -fno-tree-vectorize.

Ответ 3

У меня получилась та же ошибка, когда я скомпилировал свой код с помощью gcc-4.9.1 в MinGW32 с lib, который использует gcc-4.4.7 в качестве компилятора. И я также использовал ccache для ускорения, ccache также является проблемой. Удалите кеш в ~/.ccache/и перекомпилируйте, затем я обходю это.