链接错误2005 Visual Studio 2008 C++

Posted

技术标签:

【中文标题】链接错误2005 Visual Studio 2008 C++【英文标题】:linking error2005 visual studio 2008 c++ 【发布时间】:2011-08-26 14:34:19 【问题描述】:

我在 yacc.y 中有 struct errorStruct 和队列 errQueue 定义,然后将其移至单独的 .h 文件 但它给了我在 yacc.obj 和 node.obj 中都找到定义的链接错误! 尝试创建新的解决方案,但仍然给出同样的错误

Error   9   error LNK2005: "class std::queue<struct errorStruct,class std::deque<struct          

errorStruct,class std::allocator<struct errorStruct> > > errQueue" (?errQueue@@3V?$queue@UerrorStruct@@V?

$deque@UerrorStruct@@V?$allocator@UerrorStruct@@@std@@@std@@@std@@A) already defined in Node.obj    yacc.obj

更新

首先: Node.h // 用于节点类 yacc.y // rules + errorStruct + queue errQueue + class ErrList : 包括 "Node.h" &

然后:

Node.h // 用于节点类 + errorStruct + 队列 errQueue + 类 ErrList :包括 yacc.y // 规则:包括 "Node.h"

更新

在 Node.h 中

struct errorStruct
            int errLineNum;
            int errColNum ;
            char * errMessage;
    ;

class ErrList

public:
void pushError(int line,int col,char * message);
void popError();    
void printErrors();
int getSize();

private :
queue <errorStruct> errQueue;

;
externErrList * se = new ErrList ();

Node.h 的其余部分与此类无关 在 yacc.y 中使用se-&gt;pushError(...); 并且没有声明类 ErrList 或 errQueue

【问题讨论】:

一个建议:SO 有一个非常有用的社区,但您需要通过以简约代码示例的形式发布所有相关信息来帮助社区帮助您。大多数时候这样做你会意识到错误是什么并从中学到很多东西,如果不是这样,它会帮助你更好地帮助你。发布不充分的信息会使 Q 陷入询问更多信息的循环,只会延迟整个过程,这对您和我们都不利。 是的,我还在学习,我会努力做得更好..谢谢 别含糊其辞,做个ace;写一个propertest-case! 我也可以添加这个页面吗? ;) catb.org/~esr/faqs/smart-questions.html 【参考方案1】:

我认为您应该将代码组织为:

yacc.h   //-----> should have declaration of errQueue & errorStruct

yacc.cc  //-----> should include yacc.h, 
//It can create variables of type errQueue & errorStruct

node.cc  //-----> should include yacc.h
//It can create variables of type errQueue & errorStruct

请注意,声明应该只出现在yacc.h 中,并且它应该包含在所有需要创建上述类型实例的 cc 文件中,如果结构在任何 cc 文件中声明,除了header(yacc.h) 那么你最终会得到你提到的重新定义错误。

【讨论】:

实际上,它完全相反:我在 Node.h 中有声明,而 yacc.y 包括 node.h .. 我无法控制 yacc.cpp 因为我使用野牛来处理有了它 @Katia:您能否像我在回答中提到的那样发布您的源代码的组织?这将有助于更好地了解您的问题。 @Katia:需要看看你是如何声明你的变量的,尤其是errQueue,你能告诉我们你使用过errQueue的部分代码吗? 在 Node.h struct errorStruct.....;队列 errQueue;包括 和 using namespace std;【参考方案2】:

操作!我忘了发布答案..对不起..

在@Peter K. 的参考资料的帮助下得到它:

转到VS:项目->属性页->配置属性->链接器->命令行

并在附加选项框中添加/FORCE:MULTIPLE

【讨论】:

强制链接过程不是解决方案。您需要重新组织源代码,以免出现错误。 @wilx 我知道它只是忽略了没有解决它的错误,但至少我可以在弄清楚如何解决它的同时继续工作。冻结整个项目也不好......你不觉得吗? 我不同意。你做错了。现在解决。如果你现在不理解这个问题,你怎么知道在你忽略它的时候你不会引入更多相同的东西? ODR 是 C++ 的基础之一。

以上是关于链接错误2005 Visual Studio 2008 C++的主要内容,如果未能解决你的问题,请参考以下文章

从 Visual Studio 2005 移植到 2008 或更高版本

Visual Studio 错误 LNK2005

Visual Studio 2005 中的错误 LNK1201

如何使用 Visual Studio 2005 根据架构验证 XML 文件

从 Visual Studio 连接到 SQL Server 2005

如何让Visual Studio 2008编辑SSRS 2005报表项目没有安装SQL Business Intelligence Development Studio 2005?