MSVC Linker - Насколько важен заказ списка зависимостей?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 MSVC Linker - Насколько важен заказ списка зависимостей?

Сообщение Anonymous »

У меня есть программа (z.exe), которую я создаю из коллекции сторонних статических библиотек (A.Lib и B.Lib), а также моего собственного DLL (x.dll). К сожалению, как A.Lib, так и X.DLL используют тот же сторонний исходный код, который определяет функцию, называемую somefunc (). Объектный файл, где somefunc определяется в A.Lib, также включает в себя другие определения функций, необходимые в компиляции.
. Обратите внимание, что B.Lib действительно включает в себя вызов somefunc . Однако, если я переключаю A и B (заказ теперь B, a, x) EXE компилируется без проблем.
Я считаю, что причина, по которой этот порядок (Bax vs Abx) имеет важное значение, заключается в следующем ... если линкер обрабатывает B.Lib в первую очередь (с использованием порядка Bax), он видит нерешенное призыв некоторогофунка . Следующая библиотека, которую он обрабатывает, - это A.Lib, где находит определение somefunc , и разрешает вызов. Определение somefunc в x.dll не используется, и нет проблем с линкером. Однако, если вместо этого A.Lib обрабатывается сначала (с использованием порядка ABX), за которым следует B.Lib, он видит только неразрешенный призыв somefunc после , который он видел и, возможно, игнорировал определение somefunc в A.Lib, так что есть все возможности, которые он найдет какое -то определение в X.DLL. Затем, любые последующие попытки загрузить объектный код в A.Lib (рядом с тем, где somefunc приведет к тому, что в целом файл объекта, включая дублированное определение somefunc , и мы получаем ошибку LNK2005. Линкер неверный? Кроме того, использование порядка связывания надежным/предсказуемым способом избежать ошибок линкера, подобных этому, при условии, что приведенное выше объяснение является правильным?

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

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

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

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

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

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