Visual Studio 2013 DLL导出链接错误(LNK2019 / LNK1120)

时间:2014-07-16 09:16:14

标签: c++ dll visual-studio-2013 linker-errors

我之前已经问过类似的问题了,但看起来关于类导出的内容与简单的函数有什么不同......我检查了所有这些解决方案,检查了所有的建议,但它仍然看起来像我遗失了什么...

发生了什么:

  • 我有一个用Visual Studio 2013编写的主C ++项目,我想添加一个带有各种工具的dll库。我创建了一个虚拟的,基本上没有功能,但无法编译:
    2>  TestSvc_i.c
    2>TestSvc.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall CUtils::CUtils(void)" (__imp_??0CUtils@@QAE@XZ) referenced in function _wWinMain@16
    2>C:\Work\TestSvc_root\Debug\TestSvc.exe : fatal error LNK1120: 1 unresolved externals
    ========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========

主项目中的代码如下所示:

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
{
    CUtils *a = new CUtils();
    delete a;

    return 1;
}

我有以下设置:

  • 使用Visual Studio 2013以C ++编写的主项目;
  • 我正在使用Unicode字符集,运行时用于共享dll;
  • _UNICODE已定义;
  • 子系统:Windows(/SUBSYSTEM:WINDOWS);
  • 我想创建一个应该在共享dll中使用的实用程序库。代码如下所示:

Utils.h:

#ifdef UTILS_EXPORTS
#define UTILS_API __declspec(dllexport)
#else
#define UTILS_API __declspec(dllimport)
#endif

// This class is exported from the Utils.dll
class UTILS_API CUtils {
public:
    CUtils(void);
};

Utils.cpp:

#include "stdafx.h"
#include "Utils.h"

// This is the constructor of a class that has been exported.
// see Utils.h for the class definition
CUtils::CUtils()
{
    return;
}
  • 我检查了dll项目设置,基本上,他们都是在主项目中;
  • UTILS_EXPORTS在dll-project中定义,所以通常情况下,所有定义都应该__declspec(dllexport)(正如预期的那样,未在UTILS_EXPORTS中定义);
  • 我有以下预处理器定义:WIN32; _DEBUG; _WINDOWS; _USRDLL; UTILS_EXPORTS;
  • dll-project作为依赖项添加到master-project;
  • dll在$(SolutionDir)\Debug下复制,但不在$(SolutionDir)\$(MasterProject)\Debug下 - 我不知道为什么。我手动复制了它,但我仍然遇到同样的问题;
  • 我在Utils.dll上运行了DUMPBIN实用程序,它的外观如下:
    C:\Work\TestSvc_root\Debug>DUMPBIN /EXPORTS /SYMBOLS Utils.dll
    Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
    Copyright (C) Microsoft Corporation.  All rights reserved.


    Dump of file Utils.dll

    File Type: DLL

      Section contains the following exports for Utils.dll

    00000000 characteristics
    53C632A8 time date stamp Wed Jul 16 10:07:04 2014
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 00011154 ??0CUtils@@QAE@XZ = @ILT+335(??0CUtils@@QAE@XZ)
          2    1 000110C8 ??4CUtils@@QAEAAV0@ABV0@@Z = @ILT+195(??4CUtils@@QAEAAV0@ABV0@@Z)

    Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        4000 .text
       10000 .textbss
  • 我试图"嗅探" UTILS_API的值:
    #define DO_QUOTE(X)        #X
    #define QUOTE(X)           DO_QUOTE(X)
    #define MY_QUOTED_VAR      QUOTE(MYVARIABLE)

    #pragma message(QUOTE(UTILS_API))

转储正确的值:当"使用"从dll开始,它会转储__declspec(dllexport),当从主项目中使用时,它会转储__declspec(dllimport)

那么,有什么提示吗?看起来有些东西与类导出定义/方法修饰有关...在之前的普通旧版Visual C ++中曾经有过" def"文件,你可以映射导出的名称...但在这个新版本中,我迷路了。

谢谢!

1 个答案:

答案 0 :(得分:2)

作为一种变通方法,您可以显式地将.lib文件(在构建.dll期间生成)添加到主项目的链接器选项中的输入库列表中。