Есть ли способ, чтобы 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 автоматически обнаруживать и сообщать о таких случаях?