c++ - 链接问题(VC6)

标签 c++ visual-c++ linker visual-c++-6

我打开了一个旧工作区,它是一个库及其测试工具。它过去工作正常,但现在不行,旧版本的代码也不能工作,但会出现相同的错误。我试过重新创建项目,这也导致了同样的错误。项目设置中似乎没有任何问题,生成的代码在主应用程序中工作。

我已经删除了大部分文件并将其减少到最低限度以生成错误。不幸的是,我无法发布该项目,因为它用于生产代码。

我遇到的 LNK2001 链接器错误通常意味着我离开了一个库或忘记实现一个虚函数。然而,这是标准模板库的一部分 - 并且是一个 header 。

在 IOCompletionPort.obj 中被列为有问题的代码实际上并没有直接使用 std::string,而是调用了一个类:Comms::Exception 接受 std::stringGetLastErrorWSAGetLastError 的值。

错误中提到的函数 (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 转换为 GetMessageAGetMessageW。存在三种可能:

  1. Windows.h 尚未加载,所以 GetMessage 保持 GetMessage

  2. Windows.h 加载了 ANSI 符号集,因此 GetMessage 变为 GetMessageA

  3. Windows.h 加载了 Unicode 符号集,因此 GetMessage 变为 GetMessageW

如果您以触发两种不同场景的方式编译了两个不同的文件,您将收到链接器错误。错误消息表明 Comms::Exception 类是上面 #2 的一个实例——也许它用在了 windows.h 尚未加载的地方?

我会在你的地方做的其他事情,就像例行公事一样:

1) 确保我的包含和库路径不包含任何我不期望的内容。

2) 执行“构建清理”,然后手动验证它,必要时删除任何额外的目标文件。

3) 确保 include 语句中没有任何硬编码路径,这些路径与最初重建项目时的含义不符。

编辑:与格式斗争:(

关于c++ - 链接问题(VC6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5892/

相关文章:

c++ - 安全地转换为 unsigned char *

c++ - 接收 std::pair 作为参数并从花括号列表初始化中推导出类型的模板化函数

c++ - 返回虚函数的静态成员,缺少抽象类的 vtable

c++ - .h 文件上非常简单的函数 C++ 的链接错误

C++ GNU 链接器错误

c++ - 默认参数和泛型类

c++ - 将每行中具有不同单词数的文本文件读入C++中的二维数组

c++ - 目标文件中未解析的外部符号

c++ - 为什么分配成员会引发 NullReferenceException?

visual-c++ - 如何在 Windows 8.1 中安装凭据提供程序