LNK2001: Что я забыл установить?

Следуя моему предыдущему вопросу об отладке собственного кода, я решил создать простой тест из консольное приложение, так как я ничего не мог поделать с отладкой сервиса напрямую.

Итак, я создал консольное приложение vc6, добавил проект dll в рабочую область и запустил его.

Вместо ожидаемого выполнения он выдал следующие ошибки компоновщика:

 main.obj : error LNK2001: unresolved external symbol "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,long,long *)" (?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z)
 main.obj : error LNK2001: unresolved external symbol "int __stdcall hmGetDocBasePath(char *,long)" (?hmGetDocBasePath@@YGHPADJ@Z)
 Debug/HazManTest.exe : fatal error LNK1120: 2 unresolved externals

Кажется, это простой случай, когда вы забыли что-то в параметрах компоновщика: однако все кажется нормальным, и доступны файл lib, dll и исходный код. Если я изменяю загружаемый файл lib на бессмыслицу, он вызывает fatal error LNK1104: cannot open file "asdf.lib", так что это не проблема.

Я ранее связывался с dll, и они только что работали, так что я забыл сделать?

Обновление: согласно эта ветка Я посмотрел, смогу ли я найти дополнительную информацию. Это то, что мне дает dumpbin от VS2005.

> dumpbin /linkermember Hazardman.lib | findstr "DocumentLAdd"
     F6DC __imp__hmDocumentLAdd@36
     F6DC _hmDocumentLAdd@36
       5B __imp__hmDocumentLAdd@36
       5B _hmDocumentLAdd@36

Затем, пропустив его через undname, вы получите:

> undname ?_hmDocumentLAdd@36
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?_hmDocumentLAdd@36"
is :- "?_hmDocumentLAdd@36"

Что неверно. Если я введу искаженное имя из IDE, это даст намного лучший результат:

> undname ?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?hmDocumentLAdd@@YGHPAD0J00JJJPAJ@Z"
is :- "int __stdcall hmDocumentLAdd(char *,char *,long,char *,char *,long,long,l
ong,long *)"

Теперь у меня есть эта информация, что мне с ней делать? Судя по этой статье Рэймонда Чена, я могу вручную исправить это, но настроить параметр, но по моим результатам я не могу определить, какой вариант необходим (есть ли флажок «игнорировать все параметры» ?!).

Таким образом, кажется, что он ищет несуществующие функции или параметры функции были отключены (или dumpbin не любит библиотеки VC6), но это все еще не приближает меня к моей цели по исправлению моей проблемы.


person graham.reeds    schedule 29.03.2010    source источник
comment
Вы сделали консольное приложение зависимым от библиотеки?   -  person EvilTeach    schedule 29.03.2010
comment
Ага. DLL компилируется раньше, чем приложение.   -  person graham.reeds    schedule 29.03.2010
comment
и делаете ли вы что-нибудь с интерфейсами 'c', extern 'c' и т.п.?   -  person EvilTeach    schedule 29.03.2010
comment
Ничего подобного. Проект компилируется и работает с полдюжиной других проектов - ни у одного из них нет этой проблемы. Еще один парень в офисе взглянул на это, и он тоже не может этого понять.   -  person graham.reeds    schedule 30.03.2010
comment
Что ж, тогда я бы посоветовал вернуться к предыдущей версии, в которой она работала, и двигаться дальше оттуда.   -  person EvilTeach    schedule 30.03.2010
comment
В том-то и дело: это небольшое тестовое приложение, написанное с нуля. Я воссоздал его дважды, и оба раза получаю одну и ту же ошибку. Я пробовал разные типы консолей (те, которые поддерживают MFC, и те, которые нет), но, похоже, ни одна из них не работает.   -  person graham.reeds    schedule 31.03.2010


Ответы (1)


Вы используете правильное соглашение о вызовах? В вашей библиотеке используется stdcall. Возможно, ваш тестовый код использует cdecl (похоже, по умолчанию).

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

person foraidt    schedule 13.04.2010