LNK2001: Что я забыл установить? - PullRequest
0 голосов
/ 29 марта 2010

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

Итак, я создал консольное приложение 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 и source доступны. Если я изменю файл lib для загрузки на бессмыслицу, он поднимает fatal error LNK1104: cannot open file "asdf.lib", так что это не проблема.

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

Обновление : Согласно этой теме Я посмотрел, могу ли я узнать какую-либо дополнительную информацию. Это то, что дает мне свалка от 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 *)"

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

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

1 Ответ

1 голос
/ 13 апреля 2010

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

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

...