У меня есть сторонний lib, у меня ошибка LNK2019: не удалось решить проблему с внешним ... Как исследовать, чтобы исправить это - PullRequest
1 голос
/ 27 марта 2012

У меня есть сторонние библиотеки. (msvc10) MT / MD (статические cfgs) и динамические cfg DLL.
У меня qt + msvc10 express + win sdk.7

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

Какие шаги предпринять для изучения возможного исправления? Где я должен искать? Спасибо.

Редактировать 1:

Ошибки были:

TD_ExamplesCommon.lib(ExHostAppServices.obj) : error LNK2019: unresolved external symbol __imp__RegEnumValueW@32 referenced in function "public: virtual bool __thiscall ExHostAppServices::ttfFileNameByDescriptor(class OdTtfDescriptor const &,class OdString &)" (?ttfFileNameByDescriptor@ExHostAppServices@@UAE_N ABVOdTtfDescriptor@@AAVOdString@@@Z)
TD_ExamplesCommon.lib(ExHostAppServices.obj) : error LNK2019: unresolved external symbol __imp__RegCloseKey@4 referenced in function "public: virtual bool __thiscall ExHostAppServices::ttfFileNameByDescriptor(class OdTtfDescriptor const &,class OdString &)" (?ttfFileNameByDescriptor@ExHostAppServices@@UAE_N ABVOdTtfDescriptor@@AAVOdString@@@Z)
TD_ExamplesCommon.lib(ExHostAppServices.obj) : error LNK2019: unresolved external symbol __imp__RegQueryValueExW@24 referenced in function "public: virtual bool __thiscall ExHostAppServices::ttfFileNameByDescriptor(class OdTtfDescriptor const &,class OdString &)" (?ttfFileNameByDescriptor@ExHostAppServices@@UAE_N ABVOdTtfDescriptor@@AAVOdString@@@Z)
TD_ExamplesCommon.lib(ExHostAppServices.obj) : error LNK2019: unresolved external symbol __imp__RegOpenKeyExW@20 referenced in function "public: virtual bool __thiscall ExHostAppServices::ttfFileNameByDescriptor(class OdTtfDescriptor const &,class OdString &)" (?ttfFileNameByDescriptor@ExHostAppServices@@UAE_N ABVOdTtfDescriptor@@AAVOdString@@@Z)
..\exe\OdaQtApp.exe : fatal error LNK1120: 13 unresolved externals

В этом посте я получил решение: я должен связаться с Advapi32.lib ... У меня вопрос: откуда мне это знать?
Я пробовал зависимого обходителя, но он не может использовать .lib's ....

Ответы [ 3 ]

11 голосов
/ 27 марта 2012

В этом посте я получил решение: я должен связаться с Advapi32.lib ... Мой вопрос: как я могу это узнать?

Когда вы получите "«неразрешенная внешняя» ошибка компоновщика, это означает, что он искал совпадение для имени функции или переменной, в котором нуждается какой-либо объектный файл, и компоновщик не смог найти это имя, определенное в одном из объектных файлов или библиотек.

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

TD_ExamplesCommon.lib(ExHostAppServices.obj) : error LNK2019: unresolved external symbol
      __imp__RegEnumValueW@32 referenced in function 
      "public: virtual bool __thiscall ExHostAppServices::ttfFileNameByDescriptor(
            class OdTtfDescriptor const &,class OdString &)"
      (?ttfFileNameByDescriptor@ExHostAppServices@@UAE_N ABVOdTtfDescriptor@@AAVOdString@@@Z)

В этом сообщении об ошибке много всего (большая часть может выглядеть как мусор).К счастью, многое из этого можно игнорировать в большинстве случаев.Наиболее важным моментом является то, что компоновщик ищет символ __imp__RegEnumValueW@32 В названии есть какой-то ганк, но, к счастью, он все равно довольно узнаваем.

  • Префикс __imp__ указывает, что он ищетИмпорт DLL.Почти во всех случаях, которые можно игнорировать для ваших целей.
  • суффикс @32 - это то, что компилятор Microsoft добавляет к именам функций для определенных соглашений о вызовах.Это также, как правило, не важно для ваших целей (для записи это означает, что функция ожидает 32 байта данных аргумента)

Так что нам остается тот факт, что компоновщик ищет RegEnumValueW,Это очень похоже на название Win32 API.

Если вы посмотрите на документы для RegEnumValueW (или RegEnumValue, так как многие Win32 API имеют варианты A и Wдля обработки сборок ANSI / UNICODE) в документации мы найдем этот бит информации:

    Requirements

    Minimum supported client        Windows 2000 Professional
    Minimum supported server        Windows 2000 Server
    Header                          Winreg.h (include Windows.h)
 >> Library                         Advapi32.lib
    DLL                             Advapi32.dll
    Unicode and ANSI names          RegEnumValueW (Unicode) and 
                                    RegEnumValueA (ANSI)

Вот как вы знаете, вам нужно advapi32.lib.

Так что в будущем, когдавы получаете «неразрешенную внешнюю» ошибку от компоновщика, просто игнорируете большую часть мусора в сообщении об ошибке и концентрируетесь на символе, который говорит, что он не может найти - это должно привести вас к библиотеке, объектному файлу или другому элементу, который вы можете

Просто для записи, advapi32.lib понадобится большинству приложений Windows любой сложности.

0 голосов
/ 27 марта 2012

Вы ввели файл * .lib в настройках компоновщика?(вход -> дополнительные зависимости ") и, кроме того, путь к .lib в директории библиотек?

0 голосов
/ 27 марта 2012

вы можете попытаться использовать dependencywalker , чтобы увидеть список зависимостей для ваших библиотек и увидеть, что в нем отсутствует.

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