Theis Kristensen
Theis Kristensen

Reputation: 415

WINAPI - error LNK2019, LNK2001, LNK1120 when compiling.

Very new to WINAPI so be gentle.

I have read the "Windows via C/C++" book by Jeffrey Richter and now I'm trying to do some of the basic DLL stuff he descibes in the book.

In Chapter 19 he make a simple example. I have tried to make the example, but I keep getting these three errors when building the project:

Error   1   error LNK2019: unresolved external symbol __imp__Add referenced in function _wWinMain@16    
Error   2   error LNK2001: unresolved external symbol __imp__g_nResult
Error   3   error LNK1120: 2 unresolved externals

I have three files:

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);
}

And then (in another project, but in the same solution).

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);
}

Why am I getting these three errors? I have look at the DLLChapter19.dll via 'DUMPBIN -exports' and it looks fine, with the 2 exported symbols:

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

I have searched and searched but could not find the solution for my problem.

Upvotes: 3

Views: 1613

Answers (2)

the answer given by "David Heffernan" worked for me. You need to add your lib path to your linker path, at: {right click on your project} -> properties -> Configuration Properties -> Linker -> Input -> Additional Dependencies -> Edit.

thanks again "David Heffernan".

Upvotes: 0

David Heffernan
David Heffernan

Reputation: 612954

This is a linker error when compiling the executable. The DLL is fine, but you have not told the linker how to link to it. You need to pass to the linker the import library (the .lib file) that was created when you built your DLL.

I take it you are using Visual Studio. In which case add your import library to the Additional Library Dependencies setting in the project configuration for your executable.

Upvotes: 2

Related Questions