2010-06-21 4 views
2

В Visual Studio 2008 у меня есть решение, которое содержит два проекта: один проект - .dll, другой - приложение командной строки, которое вызывает .dll.Ошибка связи в Visual Studio 2008

Если я удалю один из файлов («ast.c»), а затем добавьте его обратно, я получаю следующую ошибку.

Как исправить эту ошибку?

Ошибка 22 Ошибка LNK2019: неразрешенный внешний символ "__declspec (DllImport) INT __cdecl ast_get_int_value (структура ast_node *, пустота *)" (__imp_ ast_get_int_value @@ YAHPAUast_node @@ PAX @ Z?) Ссылка в функции «двойной __cdecl d_low (структура ast_node *, структура ast_node *, структура ast_node *, структура ast_node *, пустота *)»(? d_low @@ YANPAUast_node @@ 000PAX @ Z) main.obj главный

ответ

2

Понял - было право щелкните по проекту, перейдите в «Linker» и «Input» и «Additional Dependencies» и добавьте «.. \ $ (ConfigurationName) \ dll.lib». Файл «dll.lib» создается как часть процесса компиляции .dll, и нам нужно сообщить компоновщику, где находится этот файл, чтобы он мог разрешать любые внешние зависимости. Это фиксировало ошибки связывания раз и навсегда.

Некоторые хорошие советы от http://www.codeproject.com/KB/DLL/XDllPt1.aspx, объясняющих процесс связывания:

  • библиотека DLL экспортирует свои символы, и приложение импортирует символы DLL. При компиляции приложения компилятор видит символы DLL через файл include (Test.h). При связывании приложения компоновщик видит DLL-символы через библиотеку импорта (Test.lib).
  • DLL должен быть в том же каталоге, что и EXE при запуске приложения. В ранних версиях Windows было приемлемой практикой размещать библиотеки приложений в каталогах Windows или System, но теперь это признано причиной проблем и не должно выполняться.

А также смотрите:

http://support.microsoft.com/kb/815065

И:

http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/a22571ad-ef89-4f94-afca-4f4d32cdd0f2

Смежные вопросы