Как понять и решить проблему связывания «неразрешенного внешнего символа»C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как понять и решить проблему связывания «неразрешенного внешнего символа»

Сообщение Anonymous »

Я создаю решение в Visual Studio, которое состоит в основном из проектов C++, на основе технологии vcpkg.
При выполнении сборки этого решения происходит сбой сборки одного проекта, как описано в следующем сообщении об ошибке:

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

1>pdfwrap.obj : error LNK2001: unresolved external symbol _HPDF_New
1>pdfwrap.obj : error LNK2001: unresolved external symbol _HPDF_LoadTTFontFromFile
1>pdfwrap.obj : error LNK2001: unresolved external symbol _HPDF_Free
Файл pdfwrap.obj находится в следующем каталоге:

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

C:\Development\workarea\\
\Release\pdfwrap.obj
Из-за особенностей hpdf vcpkg у меня есть несколько мест, где их можно найти (я показываю только файлы *.lib и *.dll\):

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

C:\Development\workarea\Debug\hpdf.dll
C:\Development\workarea\\
\vcpkg_installed\x86-windows\x86-windows\bin\hpdf.dll
C:\Development\workarea\\\vcpkg_installed\x86-windows\x86-windows\debug\bin\hpdf.dll
C:\Development\workarea\\\vcpkg_installed\x86-windows\x86-windows\debug\lib\hpdf.lib
C:\Development\workarea\\\vcpkg_installed\x86-windows\x86-windows\lib\hpdf.lib
C:\Development\workarea\vcpkg\buildtrees\libharu\x86-windows-dbg\src\hpdf.dll
C:\Development\workarea\vcpkg\buildtrees\libharu\x86-windows-dbg\src\hpdf.lib
C:\Development\workarea\vcpkg\buildtrees\libharu\x86-windows-rel\src\hpdf.dll
C:\Development\workarea\vcpkg\buildtrees\libharu\x86-windows-rel\src\hpdf.lib
C:\Development\workarea\vcpkg\packages\libharu_x86-windows\bin\hpdf.dll
C:\Development\workarea\vcpkg\packages\libharu_x86-windows\debug\bin\hpdf.dll
C:\Development\workarea\vcpkg\packages\libharu_x86-windows\debug\lib\hpdf.lib
C:\Development\workarea\vcpkg\packages\libharu_x86-windows\lib\hpdf.lib
Когда я запрашиваю неразрешенную внешнюю ссылку (например, HPDF_New), я получаю следующее:
Для файла *.lib:

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

dumpbin /exports C:\Development\workarea\vcpkg\packages\libharu_x86-windows\lib\hpdf.lib | findstr /WI "HPDF_New"
_HPDF_New@8
Для файла *.dll:

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

dumpbin /Exports C:\Development\workarea\vcpkg\packages\libharu_x86-windows\bin\hpdf.dll | findstr /I "HPDF_New"
356  163 00006A60 HPDF_New = _HPDF_New@8
По моему мнению, это означает, что ссылка, которую он ищет, определенно существует, поэтому, если он ее не находит, это может означать разные вещи:
  • Либо он все равно ее не находит (из-за @8 в конце имени?)
  • Либо он ищет не в том каталоге.
Чтобы определить, что происходит не так, я решил добавить немного подробностей в процесс связывания:
Изображение

Это привело к появлению следующих дополнительных журналов в журнале сборки:

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

1>  Searching libraries
1>      Searching C:\Program Files (x86)\Windows Kits\10\lib\10.0.26100.0\um\x86\UxTheme.lib:
1>      Searching C:\Development\workarea\\
\vcpkg_installed\x86-windows\x86-windows\lib\hpdf.lib:
1>      Searching C:\Development\workarea\\\vcpkg_installed\x86-windows\x86-windows\lib\libpng16.lib:
1>      Searching C:\Development\workarea\\\vcpkg_installed\x86-windows\x86-windows\lib\zlib.lib:
1>      Searching C:\Development\workarea\Release\:
1>      Searching C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.44.35207\:
1>      Searching C:\Program Files (x86)\Windows Kits\10\lib\10.0.26100.0\um\x86\:
1>      Searching C:\Program Files (x86)\Windows Kits\10\lib\10.0.26100.0\ucrt\x86\ucrt.lib:
1>  Finished searching libraries
1>  pdfwrap.obj : error LNK2001: unresolved external symbol \_HPDF_New
Хотя:

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

dumpbin /exports C:\Development\workarea\\
\vcpkg_installed\x86-windows\x86-windows\lib\hpdf.lib | findstr /I "HPDF_New"
_HPDF_New@8
... а также:

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

dumpbin /exports C:\Development\workarea\\
\vcpkg_installed\x86-windows\x86-windows\bin\hpdf.dll | findstr /I "HPDF_New"
356  163 00006A60 HPDF_New = _HPDF_New@8
Кто-нибудь знает, почему у меня возникает эта неразрешенная ошибка компоновщика внешних ссылок и что я могу сделать, чтобы ее решить?
Изменить: сосредоточиться на 32-битной и 64-битной версиях:

В комментариях кто-то написал, что суффикс @8 имени функции может означать, что соответствующая DLL была скомпилирована в 64-битной версии, пока я работаю с 32-битной программой.

Однако это, похоже, опровергается проверкой sigCheck:

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

C:\Development\workarea\\
\vcpkg_installed\x86-windows\x86-windows\bin>sigcheck hpdf.dll

Sigcheck v2.90 - File version and signature viewer
Copyright (C) 2004-2022 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\Development\workarea\\\vcpkg_installed\x86-windows\x86-windows\bin\hpdf.dll:
...
MachineType:    32-bit
У кого-нибудь есть другая идея?


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

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

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

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

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

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