2013-07-23 60 views
0

我有2個項目,RoofExp和testapp,RoofExp是由C寫的DLL項目,testapp是一個用於測試RoofExp.dll的win32控制檯項目。我的代碼如下:如何解決LNK2019聯動錯誤?

roofexp.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 

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 *) 

我搜索了很長時間,無法解決我的問題。有人能告訴我我的代碼有什麼問題,以及如何解決它?

+0

您是否將lib文件傳遞給鏈接器? –

+0

是的,我使用'/ LIBPATH:「lib-path」roofexp.lib'鏈接器選項將lib文件傳遞給鏈接器。 – Kecise

+0

[error LNK2019:unresolved external symbol]可能重複](http://stackoverflow.com/questions/13318965/error-lnk2019-unresolved-external-symbol),[無法解決無法解析的外部錯誤LNK2019錯誤](http:// stackoverflow.com/q/7850896/62576)和其他幾個人,所有這些都得出了基本相同的結論。 –

回答

0

有幾件事情我會檢查:

  1. 定義ParserExecute庫包含在項目中的鏈接庫列表。
  2. 該函數實際上是從該DLL定義並導出的。
0

假設您正確包含DLL的.lib文件,大多數情況下這取決於編譯器設置的差異。例如如果您的DLL是在UNICODE開啓的情況下編譯的,請確保您的APP也使用UNICODE編譯(否則TCHAR將以不同的方式定義)。

  1. 通過將「顯示進度」鏈接器設置設置爲VERBOSE,檢查是否實際加載了.lib文件。
  2. 在LIB文件上運行DUMPBIN以檢查導出的函數是否與鏈接器試圖導入的函數相同。
1

沒有明顯的方法可以確保這些函數實際上是從DLL中導出的。您的ROOF_EXP_API宏肯定看起來不對,通常是這樣寫的:

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