Сложная ошибка компоновки в Visual Studio 2008 - PullRequest
2 голосов
/ 22 июня 2010

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

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

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

Ошибка 22, ошибка LNK2019: неразрешенный внешний символ "__declspec (dllimport) int __cdecl ast_get_int_value (struct ast_node *, void *)" (__imp_? Ast_get_int_value @@ YAHPAUast_node @@ PAX @ Z) ссылается на функцию struct double (double) в функции "double" ast_node *, struct ast_node *, struct ast_node *, struct ast_node *, void *) "(? d_low @@ YANPAUast_node @@ 000PAX @ Z) main.obj main

1 Ответ

2 голосов
/ 22 июня 2010

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

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

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

А также см .:

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

А:

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

...