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ả libfoo
và bar
làm cho sử dụng rộng rãi boost. 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 mặc định được sử dụng bởi GCC v4.8, mà dường như là -std=c++0x
-std=gnu++03
).
Khi tôi cố gắng để liên kết bar
sử dụng một mặc định GCC biên soạn -std=c++0x
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 nm 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ì?
ý 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
@ 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
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