Код: Выделить всё
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
< /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
Мобильная версия