2013-01-06 15 views
10

biên dịch: 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.7zTôi đã nhận lỗi 'trùng lặp phần' khi biên dịch boost_regex với tối ưu hóa kích thước (-os)

tăng: http://sourceforge.net/projects/boost/files/boost/1.52.0/boost_1_52_0.7z

(cả trên ổ D:)

boost_regex biên soạn với:

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

mã:

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

biên soạn với các thông số:

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

lỗi:

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 

Nó biên dịch ok, nhưng tôi chưa thử nghiệm nếu nó sẽ được làm việc trong mã phức tạp hơn. Việc xóa khóa -Os sẽ xóa lỗi nhưng kích thước ứng dụng lớn gấp 2 lần sau đó.

Có lẽ tôi nên xây dựng Boost với tối ưu hóa kích thước quá cũng nhưng tôi không biết nơi để vượt qua tùy chọn này trong dòng lệnh b2.

+0

[Câu hỏi chưa được trả lời này] (http://stackoverflow.com/questions/11635485/regex-boost-library-linking-in-release-mode-warns-duplicate-section-has-differe) có cùng một vấn đề. Một trong các ý kiến ​​cho thấy rằng vấn đề có thể được tách biệt với mingw-w64. Bản g ++ 4.8.0 của Mingw-build cũng trình bày vấn đề này và gora 4.7.2 của fedora 17 không, vì vậy anh ta/cô ấy có thể đúng. –

+1

Như bạn đã nói, việc sử dụng tối ưu hóa kích thước (thêm 'tối ưu hóa = không gian' vào lệnh xây dựng tăng cường) dường như sẽ xóa bỏ vấn đề. Bạn nên đặt câu trả lời đó nếu bạn có thể xác nhận rằng nó hoạt động. PS: Vâng, vấn đề bây giờ là đảo ngược, trình biên dịch sẽ spews những lỗi/cảnh báo bất cứ khi nào bạn không sử dụng '-Os'. –

+0

@llonesmiz: cảm ơn! những công việc này. Vấn đề là tôi không thể tìm thấy tùy chọn này, nó không được in bởi 'b2 --help' cũng không phải' --help-options'. – rsk82

Trả lời

2

Tôi tin rằng đây là lỗi trình biên dịch. Cách giải quyết trong trường hợp của tôi là thêm -fno-tree-vectorize.

15

Trong trường hợp của tôi, 1.58 đã được biên dịch nội bộ bằng "-march = i686", nhưng mã của tôi thì không. Thêm "-march = i686" vào dự án của tôi đã loại bỏ tất cả "phần trùng lặp".

bài học kinh nghiệm: luôn đảm bảo chắc chắn rằng tất cả các thư viện và dự án chính được biên dịch với các tùy chọn trình biên dịch giống nhau.

+0

Tương tự cho tôi. Giữa tăng 1.57 và 1.58, điều này phải thay đổi âm thầm. Đã cho tôi một thời gian để tìm thấy nó. – SebastianK

+0

"-march = i686" làm việc cho crypto ++ với mingw. cảm ơn –

0

Tôi gặp lỗi tương tự khi tôi biên dịch mã của mình sử dụng gcc-4.9.1 trong MinGW32 với lib sử dụng gcc-4.4.7 làm trình biên dịch. Và tôi cũng sử dụng ccache để tăng tốc, ccache cũng là một vấn đề. Xóa bộ nhớ cache trong ~/.ccache/và biên dịch lại sau đó tôi giải quyết vấn đề này.