Известно, что некоторые линкеры теперь сообщают о ошибках множественных определений, когда в статических библиотеках есть несколько определений. Смотрите, например, здесь: множественное определение в статической библиотеке или здесь: линкер не издает ошибку множественной определения, когда сосуществует один и тот же символ в файле объекта и статической библиотеки. < /P>
«Проблема» может быть легко воспроизведена. Как это: < /p>
file main1.cpp < /p>
Код: Выделить всё
#include
int main()
{
std::cout
#include
int main()
{
std::cout
g++ -c main1.cpp
ar rvs main1.a main1.o
g++ -c main2.cpp
ar rvs main2.a main2.o
g++ main1.a main2.a
./a.out
даст
нет сообщения об ошибке , но вывод:
Это может быть очень опасно, поскольку поведение программы не определена в соответствии с правилом Один определения:
https://en.cppreference.com/w/cpp/language/definition. Если, например, приложение модульного тестирования создано из статических библиотек, которые содержат несколько определений важных функций, модульный тест может даже не проверить, что он должен проверить. < /P>
Конечно, настройка может быть исправлено путем удаления нескольких определений. Но это не предотвращает непреднамеренное повторное применение нескольких определений в будущем.
Есть ли способ автоматически обнаружить и/или предотвратить несколько определений в статических библиотеках и для будущего? п>
Подробнее здесь:
https://stackoverflow.com/questions/794 ... -prevented