我打开了一个旧工作区,它是一个库及其测试工具。它过去工作正常,但现在不行,旧版本的代码也不能工作,但会出现相同的错误。我试过重新创建项目,这也导致了同样的错误。项目设置中似乎没有任何问题,生成的代码在主应用程序中工作。
我已经删除了大部分文件并将其减少到最低限度以生成错误。不幸的是,我无法发布该项目,因为它用于生产代码。
我遇到的 LNK2001 链接器错误通常意味着我离开了一个库或忘记实现一个虚函数。然而,这是标准模板库的一部分 - 并且是一个 header 。
在 IOCompletionPort.obj 中被列为有问题的代码实际上并没有直接使用 std::string
,而是调用了一个类:Comms::Exception
接受 std::string
和 GetLastError
或 WSAGetLastError
的值。
错误中提到的函数 (GetMessage
) 已实现,但它是一个虚函数,因此其他类可以在需要时覆盖它。然而,编译器似乎已将其作为 Ansi 版本,但我在设置中找不到任何可以控制它的选项。我怀疑这可能是问题所在,但由于图书馆的选项很少,我无法确定。但是,这两个项目都在编译器选项中指定 _MBCS。
--------------------Configuration: TestComms - Win32 Debug-------------------- Linking... Comms.lib(IOCompletionPort.obj) : error LNK2001: unresolved external symbol "public: virtual class std::basic_string,class std::allocator > __thiscall Comms::Exception::GetMessageA(void)const " (?GetMessageA@ Exception@Comms@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) Debug/TestComms.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.
TestComms.exe - 2 error(s), 0 warning(s)
有什么建议吗?我已经浪费了整个上午的时间,也不想浪费整个下午的时间。
最佳答案
一种可能性在于 Win32 ANSI/Unicode“名称修改”,它将符号 GetMessage
转换为 GetMessageA
或 GetMessageW
。存在三种可能:
Windows.h 尚未加载,所以
GetMessage
保持GetMessage
Windows.h 加载了 ANSI 符号集,因此
GetMessage
变为GetMessageA
Windows.h 加载了 Unicode 符号集,因此
GetMessage
变为GetMessageW
如果您以触发两种不同场景的方式编译了两个不同的文件,您将收到链接器错误。错误消息表明 Comms::Exception
类是上面 #2 的一个实例——也许它用在了 windows.h 尚未加载的地方?
我会在你的地方做的其他事情,就像例行公事一样:
1) 确保我的包含和库路径不包含任何我不期望的内容。
2) 执行“构建清理”,然后手动验证它,必要时删除任何额外的目标文件。
3) 确保 include 语句中没有任何硬编码路径,这些路径与最初重建项目时的含义不符。
编辑:与格式斗争:(
关于c++ - 链接问题(VC6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5892/