Как решить ошибку привязки LNK2019?

У меня есть 2 проекта, RoofExp и testapp, RoofExp — это проект DLL, написанный на C, testapp — это консольный проект win32 для тестирования RoofExp.dll. Мой код указан ниже:

крышаэксп.ч

#ifndef ROOF_EXP_PARSER_H
#define ROOF_EXP_PARSER_H

#ifdef ROOF_EXP_API
#else
#define ROOF_EXP_API __declspec(dllimport)
#endif

#ifndef MAX_PATH
#define MAX_PATH    260         
#endif

#define MAX_PARAS   16          
enum ParaType
{
    PARA_NUMBER = 1,
    PARA_STRING
};

typedef struct _VARIABLE_INFO
{
    char    VarName[MAX_PATH];
    struct _VARIABLE_INFO   *next;
}VARIABLE_INFO, *PVARIABLE_INFO;

typedef struct _FUNCTION_INFO
{
    char    FuncName[MAX_PATH];
    int     FuncParas;
    enum ParaType FuncParaType;
    int     FuncParaList[MAX_PARAS];
    struct _FUNCTION_INFO   *next;
}FUNCTION_INFO, *PFUNCTION_INFO;


ROOF_EXP_API void __cdecl ParserUninitialize();

ROOF_EXP_API int __cdecl ParserInitialize(PVARIABLE_INFO pVarList, PFUNCTION_INFO pFuncList);

ROOF_EXP_API int __cdecl ParserExecute(char *filename, int *errcnt, char *errmsg, int bufflen, void *fptr);

#define ERROR_PARSER_BASE           1024
#define ERROR_PARSER_SUCCESS        0x00
#define ERROR_PARSER_BAD_PARAMETERS ERROR_PARSER_BASE-1
#define ERROR_PARSER_FILE_NOT_FOUND ERROR_PARSER_BASE-2
#define ERROR_PARSER_FAILED_INIT    ERROR_PARSER_BASE-3
#endif

testapp.cpp

int _tmain(int argc, _TCHAR* argv[])
{
    char szFileName[MAX_PATH];
    int nRetCode = 0;

    ParserExecute(szFileName, &nRetCode, szFilePath, 1024, NULL);


    return 0;
}

Проект RoofExp может быть успешно собран. Когда я создаю проект testapp, я получаю следующее сообщение об ошибке:

error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl ParserExecute(char *,int *,char *,int,void *)

Я долго гуглил и не могу решить свою проблему. Может ли кто-нибудь сказать мне, что не так с моим кодом и как его решить?


person Kecise    schedule 23.07.2013    source источник
comment
Вы передали файл lib компоновщику?   -  person David Heffernan    schedule 23.07.2013
comment
Да, я передал файл библиотеки компоновщику, используя /LIBPATH:"lib-path" roofexp.lib опции компоновщика.   -  person Kecise    schedule 23.07.2013
comment
возможный дубликат ошибка LNK2019: неразрешенный внешний символ, Не удается устранить неразрешенную внешнюю ошибку Ошибка LNK2019 и несколько других, все из которых приходят к одним и тем же выводам.   -  person Ken White    schedule 23.07.2013


Ответы (3)


Нет очевидного способа убедиться, что эти функции действительно экспортируются из DLL. Ваш макрос ROOF_EXP_API явно выглядит неправильно, обычно он пишется так:

#ifdef ROOF_EXP_API
#  define ROOF_EXP_API __declspec(dllexport)
#else
#  define ROOF_EXP_API __declspec(dllimport)
#endif
person Hans Passant    schedule 23.07.2013

Есть несколько вещей, которые я бы проверил:

  1. Библиотека, определяющая ParserExecute, включена в список связанных библиотек в вашем проекте.
  2. Функция фактически определяется и экспортируется из этой библиотеки DLL.
person Cătălin Pitiș    schedule 23.07.2013

Предполагая, что вы правильно включили файл .lib для DLL, в большинстве случаев это связано с различиями в настройках компилятора. например Если ваша DLL была скомпилирована с включенным UNICODE, убедитесь, что ваше приложение также скомпилировано с включенным UNICODE (иначе TCHAR будет определяться по-другому).

  1. Убедитесь, что .lib действительно загружается, установив для параметра компоновщика Show Progress значение VERBOSE.
  2. Запустите DUMPBIN в файле LIB, чтобы убедиться, что экспортированные функции совпадают с теми, которые компоновщик пытается импортировать.
person snowdude    schedule 23.07.2013