繁体   English   中英

链接问题 (VC6)

[英]Link issues (VC6)

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

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

我得到的 LNK2001 linker 错误通常意味着我已经离开了库或忘记实现虚拟 function。 然而,这是标准模板库的一部分 - 并且是 header。

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

错误( GetMessage )中提到的 function 已实现,但它是一个虚拟 function 因此其他类可以根据需要覆盖它。 但是,编译器似乎已将其作为 Ansi 版本,但我在设置中找不到任何可以控制它的选项。 我怀疑这可能是问题所在,但由于图书馆的选择方式很少,我无法确定。 但是,这两个项目都在编译器选项中指定 _MBCS。

--------------------配置:TestComms - Win32 调试--------------------链接... Comms.lib(IOCompletionPort.obj): error LNK2001: unresolved external symbol "public: virtual class std::basic_string,class std::allocator > __thiscall Comms::GetMessage::GetMessageA(void)constA@" Comms@@UBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) Debug/TestComms.exe: 致命错误 LNK1120: 1 unresolved externals 执行错误链接.exe。

TestComms.exe - 2 个错误,0 个警告

有什么建议么? 我早上的大部分时间都为此而迷失,也不想下午的大部分时间都迷失。

一种可能性在于 Win32 ANSI/Unicode “名称修改”,它将符号GetMessage转换为GetMessageAGetMessageW 有三种可能:

  1. Windows.h 还没有加载,所以GetMessage停留在GetMessage

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

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

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

我会代替你做的其他事情,就像例行公事一样:

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

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

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

编辑:与格式作斗争:(

@Curt:我认为你是最接近的。 我没有对此进行测试,但我想我在最初的问题中给出了答案。

GetMessage是 Windows.h 中的定义,包装在 ifndef 块中,用于在 Ansi (GetMessageA) 和 Unicode (GetMessageW) 之间切换。

windows.h 在 IOCompletionPort.h 的顶部被声明为包含 - 我厌倦了看到 7 行只是为了包含 1 个文件,所以我将它包装为自己的文件并包含它自己。 这还包含一些额外的#defines(即 ULONG_PTR),因为我们的主应用程序不会在安装了平台 SDK 的情况下编译:-(

  1. 这得到了证实。 没有什么是不合适的。
  2. 我已经做到了 - 删除了构建目录
  3. 我从不使用硬编码路径。

假设您没有在项目设置中删除您不应该拥有的东西(这是我期望像 User32.lib 这样的外部依赖项):

检查工具 | 选项 | 目录 | 库(从 memory 开始)并确保您不会错过 common-all-garden 品种 lib 目录(再次,我面前没有 VC6,我不能告诉你它们是什么)

这是 Microsoft 处理 ANSI 与 Unicode API 的方式的普遍问题。 由于它们全部(或几乎全部)通过为 function 名称定义宏来完成,这些名称解析为 function 名称的“A”或“W”版本,因此您不能安全地在命名空间/类/结构/枚举/中拥有标识符与 Windows API 名称匹配的函数。

windows.h 宏在所有其他命名空间上运行粗暴。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM