2017-07-27 20 views
5

Preamble

Làm việc với một mảnh lớn của mã mà tôi không thể hiện phá vỡ thành một MCVE, vì vậy tôi sẽ cố gắng của tôi tốt.Sử dụng C++ 11 so với GCC 4.8 nguyên nhân mặc định liên kết lỗi với thừa kế riêng và thúc đẩy


Vấn đề

Tôi đang làm việc với một dự án lớn được biên soạn như một thư viện tĩnh, libfoo.a. Một dự án riêng biệt, bar, liên kết với thư viện đó. Các "vi phạm" đoạn mã trong libfoo là như sau:

class Base { 
public: 
    void foo(){} 
    void bar(){} 
}; 

class Derived : private Base { 
public: 
    using Base::foo; 
}; 

Cả libfoobar làm cho sử dụng rộng rãi . bar phải được biên soạn với -std=c++11 do tính năng C++ 11 nó làm cho việc sử dụng, nhưng libfoo thể được biên dịch với các tùy chọn tối thiểu (tức là tùy chọn biên dịch -std=c++0xmặc định được sử dụng bởi GCC v4.8, mà dường như là -std=gnu++03).

Khi tôi cố gắng để liên kết bar sử dụng một -std=c++0xmặc định GCC biên soạn libfoo.a, nó không thành công với một tên nham nhở, cảnh báo kéo dài, làm giảm tới:

Undefined reference to Base::Derived::foo() 

Khi tôi tái xây dựng libfoo.a với -std=c++11, sự cố này không còn xảy ra nữa.


làm việc So Far

Tôi đã so sánh sản lượng libfoo.a qua và trong cả hai trường hợp, những biểu tượng thích hợp đã có mặt. Tôi cũng đã đi qua the Cxx11Abi compatibility documents, và nó không xuất hiện rằng cài đặt trình biên dịch này nên "phá vỡ" khả năng tương thích.


Câu hỏi

nguyên nhân về vấn đề mối liên kết này là gì?

+0

ý của bạn là gì với "cài đặt tối thiểu"? không nên '-std = C++ 11' giống với' -std = C++ 0x'? – user463035818

+0

@ tobi303 Do đó, tôi có nghĩa là không có tùy chọn trình biên dịch bổ sung (tức là cài đặt mặc định của trình biên dịch: GCC v4.8.4 trong trường hợp này). – DevNull

+0

vấn đề có thể là môi trường sẽ yse tiêu đề khác nhau cho dự thảo và phát hành 2011 tiêu chuẩn – Swift

Trả lời

0

Như MartinBonner lưu ý, nó phải làm với các thay đổi không gian tên đối với các kiểu đã được sử dụng trong các nguyên mẫu chức năng. Các giải pháp duy nhất là hoặc biên dịch thông qua -std=c++11 hoặc viết lại một lượng lớn mã để có thêm một lớp "trừu tượng" xung quanh loại.

+0

Bạn có thể đưa ra ví dụ về thay đổi không gian tên không? Làm như vậy sẽ làm cho câu trả lời này tốt hơn nhiều. –

Các vấn đề liên quan