2013-05-04 110 views
3

WINAPI非常新,所以要温柔。WINAPI - 编译时出错LNK2019,LNK2001,LNK1120。

我已经阅读了Jeffrey Richter的“通过C/C++编写的Windows”一书,现在我正在尝试做一些他在书中描述的基本DLL内容。

在第19章中,他举了一个简单的例子。我试图让这个例子,但建设项目时,我不断收到这三个错误:

Error 1 error LNK2019: unresolved external symbol __imp__Add referenced in function [email protected]  
Error 2 error LNK2001: unresolved external symbol __imp__g_nResult 
Error 3 error LNK1120: 2 unresolved externals 

我有三个文件:

DLLChapter19.h:

#ifdef MYLIBAPI 
#else 
#define MYLIBAPI extern "C" __declspec(dllimport) 
#endif 
MYLIBAPI int g_nResult; 
MYLIBAPI int Add(int nLeft, int nRight); 

DLLChapter19.cpp:

//#include <Windows.h> //apparently the complier says that I should use stdafx.h instead(?) 
#include "stdafx.h" 
#define MYLIBAPI extern "C" __declspec(dllexport) 
#include "DLLChapter19.h" 

int g_nResult; 

int Add(int nLeft, int nRight) { 
    g_nResult = nLeft + nRight; 
    return(g_nResult); 
} 

然后(在另一个项目中,但在相同的解决方案中)。

DLLChapter19EXE.cpp:

//#include <Windows.h> //apparently the complier says that I should use stdafx.h instead? 
#include "stdafx.h" 
#include <strsafe.h> 
#include <stdlib.h> 

#include "C:\Users\Kristensen\Documents\Visual Studio 2012\Projects\DLLChapter19\DLLChapter19\DLLChapter19.h" 

int WINAPI _tWinMain(HINSTANCE , HINSTANCE , LPTSTR, int) { 

    int nLeft = 10, nRight = 25; 

    TCHAR sz[100]; 
    StringCchPrintf(sz, _countof(sz), TEXT("%d +%d =%d"), 
     nLeft, nRight, Add(nLeft, nRight)); 
    MessageBox(NULL, sz, TEXT("Calculation"), MB_OK); 

    StringCchPrintf(sz, _countof(sz), 
     TEXT("The result from the last Add is: %d"), g_nResult); 
    MessageBox(NULL, sz, TEXT("Last Result"), MB_OK); 
    return(0); 
} 

为什么会出现这三个错误?我看通过“DUMPBIN -exports”的DLLChapter19.dll,它看起来不错,与2倍输出的符号:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\amd64>dumpbin -export 
s DLLChapter19.dll 
Microsoft (R) COFF/PE Dumper Version 11.00.60315.1 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file DLLChapter19.dll 

File Type: DLL 

    Section contains the following exports for DLLChapter19.dll 

    00000000 characteristics 
    5184F8EE time date stamp Sat May 04 14:02:54 2013 
     0.00 version 
      1 ordinal base 
      2 number of functions 
      2 number of names 

    ordinal hint RVA  name 

      1 0 000110C3 Add 
      2 1 00017128 g_nResult 

    Summary 

     1000 .data 
     1000 .idata 
     2000 .rdata 
     1000 .reloc 
     1000 .rsrc 
     4000 .text 
     10000 .textbss 

我已经搜查,搜查,但找不到我的问题的解决方案。

回答

2

编译可执行文件时,这是一个链接器错误。该DLL很好,但你没有告诉链接器如何链接到它。您需要将链接器传递到构建DLL时创建的导入库(.lib文件)。

我认为你使用的是Visual Studio。在这种情况下,将您的导入库添加到附加库依赖关系中为您的可执行文件设置项目配置。

+0

非常感谢大卫,大卫! – 2013-05-04 13:20:44

0

“David Heffernan”给出的答案为我工作。您需要将您的lib路径添加到您的链接器路径中,在{右键单击您的项目} - >属性 - >配置属性 - >链接器 - >输入 - >其他依赖项 - >编辑。

再次感谢“David Heffernan”。