仅在调试模式下出现LNK2005错误

时间:2015-09-02 10:00:23

标签: c++ visual-studio-2010 dll ace

通常我最终会设法解决这些LNK2005(已经在对象中定义的符号)错误,但是这个让我好斗。我有一个VS2010解决方案,其中包含几个项目输出可执行文件。此可执行文件依赖于同一解决方案中包含的库,因此我将它们添加到可执行项目的“引用”列表中,以便它们自动链接。

现在,当我尝试构建可执行文件(Server.exe)时,如果选择了发布配置,但是如果我切换到 debug 我收到以下LNK2005错误:

error LNK2005: "public: class ACE_SOCK_Stream & __thiscall ACE_Svc_Handler<class ACE_SOCK_Stream,class ACE_NULL_SYNCH>::peer(void)const " (?peer@?$ACE_Svc_Handler@VACE_SOCK_Stream@@VACE_NULL_SYNCH@@@@QBEAAVACE_SOCK_Stream@@XZ) already defined in Shell.obj     network.lib(network.dll)    Server (server\Server)

从错误中可以看出,项目使用ACE库。

我查看了错误中提到的ACE_Svc_Handler<class ACE_SOCK_Stream,class ACE_NULL_SYNCH>,发现network.dll中的一个导出类继承了它:

class DLL_API NetHandler : public ACE_Svc_Handler < ACE_SOCK_STREAM, ACE_NULL_SYNCH >
{
    ...
}

...在Server.exe中还有一个继承自它的类:

class Shell : public ACE_Svc_Handler < ACE_SOCK_STREAM, ACE_NULL_SYNCH >
{
    ...
}

然后,peer()NetHandler类都会使用错误中提到的Shell方法。

我不确定是否,如果是这样,为什么会导致LNK2005错误?令我更加困惑的是,我只在 debug 模式下遇到链接器错误。我还应该提到NetHandler导出的network.dll类不会被Server.exe使用,但是其他项目也依赖于network.dll

任何可能导致此问题以及如何解决问题的想法?我不确定在哪里继续调查。

更新:如果我没有在我的NetHandler中导出network.dll类,则链接器错误会消失,但我需要导出该类。

更新2:我在关于LNK2005的另一个问题中找到了这个link,虽然该链接没有完全描述我的场景,但我尝试了所提出的解决方案,如果我放置了这个,我设法摆脱了链接器错误我的class Shell...项目中Server.exe之前的一行:

extern template class __declspec(dllimport) ACE_Svc_Handler < ACE_SOCK_STREAM, ACE_NULL_SYNCH >;

那么这条线究竟做了什么?它是否告诉Server项目本身没有定义ACE_Svc_Handler < ACE_SOCK_STREAM, ACE_NULL_SYNCH >,而是从一个链接的库中导入它?

0 个答案:

没有答案