0

我有两个项目,RoofExp 和 testapp,RoofExp 是一个 C 语言编写的 DLL 项目,testapp 是一个 win32 控制台项目,用于测试 RoofExp.dll。我的代码如下:

屋顶exp.h

#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

测试应用程序.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 *)

我google了很长时间,无法解决我的问题。有人能告诉我我的代码有什么问题以及如何解决吗?

4

3 回答 3

1

没有明显的方法可以确保这些函数实际上是从 DLL 中导出的。你的 ROOF_EXP_API 宏肯定看起来不对,它通常是这样写的:

#ifdef ROOF_EXP_API
#  define ROOF_EXP_API __declspec(dllexport)
#else
#  define ROOF_EXP_API __declspec(dllimport)
#endif
于 2013-07-23T11:52:18.197 回答
0

假设您正确地包含了 DLL 的 .lib 文件,大多数情况下这取决于编译器设置的差异。例如,如果您的 DLL 是在打开 UNICODE 的情况下编译的,请确保您的 APP 也是在打开 UNICODE 的情况下编译的(否则 TCHAR 的定义将不同)。

  1. 通过将“显示进度”链接器设置设置为 VERBOSE 来检查 .lib 是否实际正在加载。
  2. 对 LIB 文件运行 DUMPBIN 以检查导出的函数与链接器尝试导入的函数是否相同。
于 2013-07-23T08:40:04.607 回答
0

我会检查几件事:

  1. 定义 ParserExecute 的库包含在项目的链接库列表中。
  2. 该函数实际上是从该 DLL 定义和导出的。
于 2013-07-23T08:33:41.343 回答