2008-08-08 144 views
6

我打开了一个旧的工作区,它是一个libray及其测试工具。它过去工作得很好,但现在没有,老版本的代码也不能使用相同的错误。我尝试重新创建项目,并导致相同的错误。在项目设置中没有任何东西出现乱码,并且生成的代码在主应用程序中可用。链接问题(VC6)

我已经剥去了大部分文件,并把它归结为最低限度生成错误。不幸的是,我不能发布项目,因为这是用于生产代码。

LNK2001链接器错误我通常意味着我已经离开了一个库或忘记实现一个虚拟功能。然而,这是标准模板库的一部分,并且是一个标题。

被列为具有IOCompletionPort.obj问题实际上不直接使用std::string,但并调用的类,它的代码:Comms::Exception接受std::stringGetLastErrorWSAGetLastError值。

错误(GetMessage)中提到的函数是实现的,但它是一个虚函数,所以其他类可以在需要时覆盖它。然而,它似乎是编译器使它成为一个Ansi版本,但我无法找到设置中的任何选项来控制它。我怀疑这可能是问题,但由于图书馆的选择方式很少,我无法确定。但是这两个项目在编译器选项中指定_MBCS。

--------------------配置:TestComms - Win32 Debug ------------------ - 链接... Comms.lib(IOCompletionPort.obj) :错误LNK2001:无法解析的外部符号“公共:虚拟类 std :: basic_string,类 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:致命错误LNK1120:1个未解析的外部程序 执行link.exe时出错。

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

有什么建议?我已经失去了大部分的时间,也不想在下午的大部分时间里失去。

回答

4

一个可能性在于Win32 ANSI/Unicode“name-mangling”,它将符号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)确保包含语句中没有任何硬编码路径,这并不意味着它们在最初重建项目时意味着什么。

编辑:与格式:(

0

WINDOWS.H在IOCompletionPort.h的顶部,宣布战斗的包括 - 我生病看到7个系只是包括1个文件,所以我已经把它包了自己的文件,包括本身。这也包含了一些额外的#define(即ULONG_PTR)作为我们的主要的应用程序将不会安装:-(

  1. 即证实了这一平台SDK编译。没有什么是不适当的。
  2. 我这样做了 - 删除了构建目录
  3. 我从不使用硬编码路径。
0

假设你有没有与项目设置删除的东西,你不应该有(这是我所期待的外部依赖像USER32.LIB是)左右futzed:

检查工具|选项|目录|图书馆(从这里回忆),并确保你不会错过常见的所有花园品种lib目录(再次,没有VC6在我面前,我不能告诉你它们是什么)

1

@Curt :我想你是最接近的。我没有测试过这个,但我想我有点在我原来的问题中给出了答案。

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

0

这是Microsoft处理ANSI与Uni​​code API的方式的一个普遍问题。由于它们都是通过为解析为函数名称的'A'或'W'版本的函数名称定义宏来完成的(或几乎全部),所以不能在您的名称空间/ class/struct/enum /函数匹配Windows API名称。

windows.h宏对所有其他名称空间运行粗糙。