Как можно обнаружить/предотвратить несколько определений в статических библиотеках?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как можно обнаружить/предотвратить несколько определений в статических библиотеках?

Сообщение Anonymous »

Известно, что некоторые линкеры не сообщают об ошибках определения, когда в статических библиотеках есть несколько определений. Смотрите, например, здесь: множественное определение в статической библиотеке или здесь: линкер не издает ошибку множественной определения, когда сосуществует один и тот же символ в файле объекта и статической библиотеки. < /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
даст нет сообщения об ошибке , но вывод:

Код: Выделить всё

Hello, World 1!
Это может быть очень опасно, так как поведение программы не определена в соответствии с правилом определения: https://en.cppreference.com/w/cpp/language/definition. /p>
и если, например, приложение модульного тестирования создано из статических библиотек, которые содержат несколько определений важных функций, модульный тест может даже не проверить, что он должен проверить. < /p> < Br /> Конечно, настройка может быть исправлена ​​путем удаления нескольких определений. Но это не предотвращает непреднамеренное повторное применение нескольких определений в будущем.
Есть ли способ автоматически обнаружить и/или предотвратить несколько определений в статических библиотеках и для будущего? п>

Подробнее здесь: https://stackoverflow.com/questions/794 ... -prevented
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»