Понимание поведения линкера MSVCC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Понимание поведения линкера MSVC

Сообщение Anonymous »

У меня есть программа (Call It z.exe), которую я создаю из коллекции сторонних статических библиотек (вызовите их A.Lib и B.Lib), а также мой собственный DLL (Call It x.dll). К сожалению, как A.Lib, так и X.DLL используют один и тот же сторонний исходный код, который определяет функцию, называемую someFunc (). X.DLL обязательно экспортирует SomeFunc для использования в ряде других библиотек и бывших. И использование A.Lib кода находится за пределами моего элемента управления.

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

10947 2AC2 00020487 somefunc = @ILT+128130(somefunc)
< /code>
Если я запускаю dimplbin /symbols < /code> on a.lib i get: < /p>
034 000007C0 SECT5  notype ()    External     | somefunc
823 00000000 UNDEF  notype ()    External     | somefunc
z.dll не использует эту функцию, но она зависит от других функций/символов, определенных в A.Lib, B.Lib и X.DLL. Исторически я имел возможность компилировать z.exe без каких -либо проблем с линкером. Тем не менее, я недавно обновил A.Lib и B.Lib (из набора сторонних статических LIBS), и теперь я получаю ошибку lnk2005: SomeFunc, уже определенная в x.dll . Единственное, что, по -видимому, изменилось, это то, что B.Lib теперь использует SomeFunc. Ранее это не так.C57 00000000 UNDEF notype () External | somefunc
< /code>
Насколько я понимаю, это использование функции в каком -то другом объекте (за пределами объектного файла, где он определен), заставляет линкетер искать определение, и он находит несколько версий. Отсюда ошибка линкера. Однако я все еще не смущаю, что происходит за кулисами ... < /p>
Если я перечисляю статические библиотеки в этом порядке: A.Lib, B.Lib, X.Lib (x.dll), я получаю ошибку линкера, говоря, что какая -то функция в объектном файле A уже определен в X. Если я переключаю порядок A и B в среде сборки, ошибка уходит. С ошибкой, когда я запускаю Dilmbin на z.exe, становится ясно, что объектный код в А был использован для создания окончательного EXE, и определение ComeFunc в X.DLL было проигнорировано, что я хочу. Я просто не понимаю, почему это работает. Я предполагаю, что список A.Lib сначала дает то, что я хочу сначала, но это не так. Кто -нибудь может объяснить? Или, по крайней мере, предоставьте предлагаемое чтение, которое может объяснить, что происходит за кулисами. Я использую MSVC/VS2022.
, чтобы спросить более четко: если somefunc определение находится в A.Lib (и также x.dll), в то время как B.Lib включает в себя звонок в SomeFunc, то почему мой Exe Compility, когда я перечисляю зависимости как b, тогда x ... но если я перечисляю их, x, x, x, x, я получаю Aftment of of of of iS. /> Кроме того, я подозреваю, что основание связывания успеха на перечисленном порядке зависимостей - это немного хрупкий способ сделать это, и я работаю над лучшим решением. Но сейчас я просто хотел бы видеть вещи так, как линкер это видит.

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

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

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

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

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

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