Есть ли способ для 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;
}
Строительство
# 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
Изменить порядок в библиотеке
# g++ main.o FakePort.a Port.a
# ./a.out
Hello world from FakePort
Согласно этой странице :
Если символ определен в двух разных библиотеках, gcc будет использовать первую найденную и игнорировать вторую, если только вторая не включена в объектный файл, который включается по какой-либо другой причине.
Так что вышеупомянутое поведение имеет смысл. К сожалению, я наследую значительную базу кода, которая не использует пространства имен (и добавить их сейчас невозможно) и использует некоторые общие имена классов в нескольких библиотеках. Я хотел бы автоматически обнаруживать дубликаты имен во время ссылки, чтобы убедиться, что неправильная копия класса не была случайно создана. Что-то вроде:
# g++ -Wl,--warnLibraryDupSymbols main.o FakePort.a Port.a
Warning: Duplicate symbol: Port
но я не могу найти ничего в настройках компоновщика GCC, чтобы сделать это. Можно ли заставить GCC автоматически обнаруживать и сообщать о таких случаях?