Link issues (VC6)我打开了一个旧的工作空间,它是一个libray及其测试工具。它曾经可以正常工作,但现在不行,并且旧版本的代码也无法工作,并且存在相同的错误。我尝试重新创建项目,这也会导致相同的错误。项目设置中似乎没有任何异常,并且生成的代码在主应用程序中有效。 我删除了大多数文件,并将其降至最低限度以生成错误。不幸的是,我无法发布该项目,因为它已在生产代码中使用。 我收到的LNK2001链接器错误通常表示我放弃了一个库或忘记了实现虚函数。但是,这是标准模板库的一部分-也是该模板的标头。
在IOCompletionPort.obj中被列为有问题的代码实际上并没有直接使用
错误(
有什么建议?我已经失去了大部分时间,也不想失去大部分时间。
一种可能是Win32 ANSI / Unicode" name-mangling",它将符号
Windows.h尚未加载,因此
Windows.h加载了为ANSI设置的符号,因此
Windows.h加载了为Unicode设置的符号,因此
如果您以触发两种不同情况的方式编译了两种不同的文件,则会收到链接器错误。错误消息表明 作为例行事务,我会代替您执行其他操作: 1)确保我的包含和库路径不包含我所不期望的任何内容。 2)执行"内部清理",然后手动进行验证,并在必要时删除所有多余的目标文件。 3)确保include语句中没有任何硬编码的路径,这些路径并不意味着项目最初重建时的含义。 编辑:与格式战斗:( @Curt:我想你来得最近。我还没有测试过,但是我想我在最初的问题中给出了答案。 GetMessage是Windows.h中的一个定义,包装在ifndef块中,以在Ansi(GetMessageA)和Unicode(GetMessageW)之间切换。 这是Microsoft处理ANSI与Uni??code API的方式的普遍问题。由于它们都是(或几乎全部)通过为函数名称定义解析为函数名称的" A"或" W"版本的宏来完成的,因此您不能在名称空间/类/结构/枚举/中安全地拥有标识符与Windows API名称匹配的函数。 Windows.h宏在所有其他命名空间上运行不便。 假设您没有对Project设置感到困惑,删除了您不应该拥有的东西(这是我希望像User32.lib这样的外部依赖项所在的位置): 检查工具|选项|目录|库(从内存中移出),并确保您没有丢失通用花园的各种lib目录(同样,在我面前没有VC6的情况下,我无法告诉您它们是什么) 在IOCompletionPort.h的顶部将windows.h声明为包含-我讨厌看到7行仅包含1个文件,因此我将其包装为自己的文件并包含该文件。这也包含一些附加的#define(即ULONG_PTR),因为我们的主应用程序无法与已安装的Platform SDK一起编译:-( |