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 и 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 ответ
Вы используете правильное соглашение о вызовах? Ваша библиотека, кажется, использует stdcall
, Может быть, ваш тестовый код использует cdecl
(кажется, по умолчанию).
Согласно этой странице, оформление имени компоновщика отличается между соглашениями о вызове, поэтому это может объяснить симптомы, которые вы видите.