Có cách nào để GCC đưa ra cảnh báo trong khi liên kết các thư viện có chứa các lớp có cùng tên không? Ví dụLiên kết các thư viện với các tên lớp trùng lặp bằng GCC
Port.h
class Port {
public:
std::string me();
};
Port.cpp
#include "Port.h"
std::string Port::me() { return "Port"; }
FakePort.h
class Port {
public:
std::string me();
};
FakePort.cpp
#include "FakePort.h"
std::string Port::me() { return "FakePort"; }
main.cpp
#include "Port.h"
int main() {
Port port;
std::cout << "Hello world from " << port.me() << std::endl;
return 0;
}
Building
# g++ -c -o Port.o Port.cpp
# ar rc Port.a Port.o
# g++ -c -o FakePort.o FakePort.cpp
# ar rc FakePort.a FakePort.o
# g++ -c -o main.o main.cpp
# g++ main.o Port.a FakePort.a
# ./a.out
Hello world from Port
Thay đổi thư viện để
# g++ main.o FakePort.a Port.a
# ./a.out
Hello world from FakePort
Theo this page:
Nếu một biểu tượng được định nghĩa trong hai thư viện gcc khác nhau sẽ sử dụng cái đầu tiên mà nó tìm thấy và bỏ qua một giây trừ khi cái thứ hai được bao gồm trong một tập tin đối tượng mà được bao gồm vì một số lý do khác.
Vì vậy, hành vi trên có ý nghĩa. Thật không may tôi đang thừa kế một cơ sở mã khá lớn mà không sử dụng không gian tên (và thêm chúng không khả thi ngay bây giờ) và sử dụng một số tên lớp chung chung trong nhiều thư viện. Tôi muốn tự động phát hiện tên trùng lặp tại thời gian liên kết để đảm bảo rằng bản sao sai của một lớp không phải là vô tình đang được instantiating. Một cái gì đó như:
# g++ -Wl,--warnLibraryDupSymbols main.o FakePort.a Port.a
Warning: Duplicate symbol: Port
nhưng tôi không thể tìm thấy bất kỳ điều gì trong tùy chọn trình liên kết GCC để thực hiện điều đó. Liệu GCC có thể tự động phát hiện và báo cáo các trường hợp như vậy không?
liên quan: http://stackoverflow.com/questions/10671956/same-class-name-in-different-c-files – oliver