2

对于我什至没有直接调用的方法,我在 Visual Studio 中遇到了一大堆链接器错误。我白天是一名 Java 开发人员,但我有一个需要用 C++ 完成的项目,旨在在 Windows 机器上运行。因此,我被困在 Visual Studio 上。

Bascally,我有一个 os 项目,我添加了一个访问器方法。我将该项目编译为 .lib 文件(编译和链接很好)。

然后我有自己的项目使用该库。我已将库包含在 Project->Properties -> Linker -> Input 下,并在 General -> Additional Lib Directories 中设置适当的目录。我已将标头包含在适当的文件中,我只是调用其中一个类的构造函数……甚至没有调用我创建的方法。

代码可以编译,但我得到以下大量链接器错误——主要是 LNK2019 和 LNK2001 错误。我尝试在不同的设置(lib、exe 等)下重新编译,链接器错误似乎只会成倍增加。当我切换回以前的设置时,错误数量仍处于峰值。任何想法如何解决这一问题?

构建日志

构建开始:项目:SpamCapture,配置:调试|Win32

命令行:

创建临时文件“c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp”,内容为 [ /VERBOSE:LIB /OUT:"C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe" /INCREMENTAL /LIBPATH: "C:\SpamCapture\Config\Debug\" /MANIFEST /MANIFESTFILE:"Debug\SpamCapture.exe.intermediate.manifest" /NODEFAULTLIB:"libcmtd.lib" /NODEFAULTLIB:"nafxcwd.lib" /DEBUG /PDB:"c :\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 KeyCapture_Config.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32 .lib uuid.lib odbc32.lib odbccp32.lib

“.\Debug\Interaction.obj”

“.\Debug\InteractionSet.obj”

“.\Debug\LogReader.obj”

".\Debug\SpamCapture.obj"

“.\调试\stdafx.obj”

".\Debug\SpamCapture.res"

".\Debug\SpamCapture.exe.embed.manifest.res" ] 创建命令行 "link.exe @c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp /NOLOGO /ERRORREPORT:PROMPT"

输出窗口:

正在链接... LINK:警告 LNK4067:入口点不明确;选择 'mainCRTStartup' 搜索库 搜索 C:\SpamCapture\Config\Debug\KeyCapture_Config.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\kernel32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\ lib\winspool.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib:搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib: 搜索 C:

链接器错误从这里开始:

KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj) : 错误 LNK2001: 无法解析的外部符号 "public: virtual int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)

......更像这样的一堆

KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj) : 错误 LNK2019: 无法解析的外部符号 "public: struct HICON__ * thiscall CWinApp::LoadIconA(unsigned int)const " (?LoadIconA@CWinApp@@QBEPAUHICON @@I@Z) 在函数中引用"公共:__thiscall CKeyCapture_ConfigDlg::CKeyCapture_ConfigDlg(class CWnd *)" (??0CKeyCapture_ConfigDlg@@QAE@PAVCWnd@@@Z)

......更多这样的

(?DoDataExchange@SetupDialog@@MAEXPAVCDataExchange@@@Z) C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe:致命错误 LNK1120:34 个未解决的外部

结果:

构建日志保存在“file://c:\SpamCapture\SpamCapture\SpamCapture\Debug\BuildLog.htm” SpamCapture - 44 个错误,1 个警告

4

4 回答 4

5

该库KeyCapture_Config.lib使用 MFC GUI 类(CWndCWinApp等),但您将其链接到的应用程序是控制台应用程序(请参阅/SUBSYSTEM:CONSOLE链接器命令行中的选项)。这行不通。您应该创建一个新的 MFC GUI 应用程序项目并将库添加到该项目。

编辑:我刚刚检查了您评论中的链接:http ://dynamicnetservices.com/~will/academic/textinput/keycapture/ 似乎 KeyCapture_Config 实际上是一个使用 KeyCapture DLL 的 MFC 对话框应用程序。可以通过直接链接到KeyCapture.lib.

于 2008-10-27T19:31:37.590 回答
1

链接错误似乎是在抱怨缺少很多 MFC 功能,并且您的链接行包括: /NODEFAULTLIB:"nafxcwd.lib" 这将排除 MFC。您要链接的库是用 MFC 构建的吗?

其他要检查的事情是您正在使用相同的字符集(即都是多字节或都是 unicode)编译应用程序和库。

构建库时没有链接步骤,因此可以将任意对象集合放入库中,而无需考虑它们可能还需要什么。

于 2008-10-27T18:16:40.220 回答
0

看起来您的项目正在与调试多线程运行时链接。这是你的意图吗?如果是这样,可能与您似乎正在使用的 KeyCapture_Config 库不一致。

KeyCapture_Config 是第 3 方库吗?如果是这样,您是从源代码构建它还是为您提供了 lib/dll?

可能只需要对正在构建的 C/C++ 运行时进行一些调查。您可以参考Microsoft 知识库文章,该文章可能有助于阐明可能的运行时构建差异。

于 2008-10-27T18:27:10.807 回答
0

我认为 Rob Walker 已经解决了这个问题。如果 KeyCapture_Config.lib 的文档说没有与 MFC 的链接,请检查需要链接到 MFC 的指令的源。像这样的东西:

#pragma comment(lib, "nafxcwd.lib")

会导致对 MFC 的依赖,并且 KeyCapture_Config.lib 文档可能已过时。

于 2008-10-27T18:55:36.867 回答