通常我最终会设法解决这些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 >
,而是从一个链接的库中导入它?