что произойдет, если у меня будет один и тот же файл cpp, скомпилированный в библиотеке и приложении? - PullRequest
1 голос
/ 26 июня 2019

Немного теоретического вопроса (вместо конкретного примера) Я думал, что понял это, но теперь у меня снова возникают сомнения ...

Сценарий:

  1. У нас есть общий класс с именем bob и его реализация только для заголовка.

  2. У нас есть библиотека (lib1), которая использует bob (такой, что bob определен вскомпилированная библиотека).

  3. У нас также есть приложение (exe1), которое использует bob (такое, что bob определено в скомпилированном исполняемом файле).

Теперь есть (afaik) определение bob в lib1 и exe1.Что произойдет, если я попытаюсь связать lib1 в exe1 ... это возможно?

Есть ли какая-то разница, если я сделаю класс bob в пару файлов .cpp и .hpp искомпилировать файл cpp как в библиотеке, так и в exectuable - или это в основном одно и то же?

Мой вопрос действительно относится к тому, какие определения находятся в двух двоичных файлах и что действительно делает компоновщик со всем этим?(код тривиален).Насколько я понимаю, это всегда должно вызывать переопределение ошибки bob, но я, кажется, не вижу этого.

Это может означать, что я что-то делаю неправильно - поэтому яРебята, хотели бы подтвердить, правильно ли то, что я считаю?

1 Ответ

2 голосов
/ 26 июня 2019

Теперь есть (afaik) определение bob как в lib1, так и в exe1.Что произойдет, если я попытаюсь связать lib1 с exe1 ... это возможно?

Компоновщик будет использовать определение bob из exe и игнорирует определение из lib1 (независимо от того, является ли библиотека статической илидинамический).Это связано с тем, что компоновщики ищут в библиотеках только неразрешенных символов.

Однако, если вы попытаетесь связать 2 объектных файла, оба из которых содержат определения bob, вы получите множественное определение символа ошибка, поскольку компоновщик извлекает все содержимое объектного файла (в отличие от библиотек).

Вышеприведенное относится к не встроенным символам только с внешней связью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...