链接问题(VC6)

gra*_*eds 10 c++ linker visual-c++-6 visual-c++

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

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

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

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

error(GetMessage)中提到的函数已实现,但它是一个虚函数,因此如果需要,其他类可以覆盖它.但是看起来编译器已经把它变成了Ansi版本,但我找不到控制它的设置中的任何选项.我怀疑这可能是问题,但由于库的选项方式很少,我无法确切知道.但是两个项目都在编译器选项中指定_MBCS.

--------------------配置:TestComms - Win32 Debug --------------------链接... Comms.lib(IOCompletionPort.obj):错误LNK2001:未解析的外部符号"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:致命错误LNK1120:1未解析的外部错误执行LINK.EXE.

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

有什么建议?我早上大部分时间都已经失去了这个,也不想在下午的大部分时间里失去.

Cur*_*her 6

一种可能是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)确保include语句中没有任何硬编码的路径,这些路径并不意味着项目最初重建时的含义。

编辑:与格式战斗:(