我之前已经问过类似的问题了,但看起来关于类导出的内容与简单的函数有什么不同......我检查了所有这些解决方案,检查了所有的建议,但它仍然看起来像我遗失了什么...
发生了什么:
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;
}
我有以下设置:
_UNICODE
已定义; /SUBSYSTEM:WINDOWS
); 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;
}
UTILS_EXPORTS
在dll-project中定义,所以通常情况下,所有定义都应该__declspec(dllexport)
(正如预期的那样,未在UTILS_EXPORTS
中定义); WIN32
; _DEBUG
; _WINDOWS
; _USRDLL
; UTILS_EXPORTS
; $(SolutionDir)\Debug
下复制,但不在$(SolutionDir)\$(MasterProject)\Debug
下 - 我不知道为什么。我手动复制了它,但我仍然遇到同样的问题; 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
#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"文件,你可以映射导出的名称...但在这个新版本中,我迷路了。
谢谢!
答案 0 :(得分:2)
作为一种变通方法,您可以显式地将.lib文件(在构建.dll期间生成)添加到主项目的链接器选项中的输入库列表中。