我有5个文件,如下例所示 - Dec.h,Dec.cpp,decInterface.h,decInterface.cpp和temp.c
How to use c++ objects in c? 和 Developing C wrapper API for Object-Oriented C++ code 将main放在一个名为temp.c的文件中,该文件在接口文件的帮助下调用Dec.cpp中实现的cpp代码。
它们都驻留在vs2008中的一个项目中,我已将compile as选项设置为default而不是编译为c或编译为c ++
我收到以下链接错误
1>Compiling...
1>decInterface.cpp
1>Generating Code...
1>Compiling...
1>temp.c
1>Generating Code...
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Linking...
1>decInterface.obj : error LNK2005: "public: __thiscall Node::Node(class std::vector<float,class std::allocator<float> >)" (??0Node@@QAE@V?$vector@MV?$allocator@M@std@@@std@@@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "public: __thiscall Node::Node(float,float)" (??0Node@@QAE@MM@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "public: __thiscall Node::Node(class std::vector<float,class std::allocator<float> >,class std::vector<bool,class std::allocator<bool> >)" (??0Node@@QAE@V?$vector@MV?$allocator@M@std@@@std@@V?$vector@_NV?$allocator@_N@std@@@2@@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "public: __thiscall reprVectorsTree::reprVectorsTree(class std::vector<class Node *,class std::allocator<class Node *> >,int)" (??0reprVectorsTree@@QAE@V?$vector@PAVNode@@V?$allocator@PAVNode@@@std@@@std@@H@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "public: __thiscall reprVectorsT
ree::reprVectorsTree(float * *,int,int)" (??0reprVectorsTree@@QAE@PAPAMHH@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "private: class std::vector<bool,class std::allocator<bool> > __thiscall reprVectorsTree::binaryForm(int,int)" (?binaryForm@reprVectorsTree@@AAE?AV?$vector@_NV?$allocator@_N@std@@@std@@HH@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "public: class std::vector<float,class std::allocator<float> > __thiscall reprVectorsTree::decode(class std::vector<bool,class std::allocator<bool> >)" (?decode@reprVectorsTree@@QAE?AV?$vector@MV?$allocator@M@std@@@std@@V?$vector@_NV?$allocator@_N@std@@@3@@Z) already defined in Dec.obj
1>decInterface.obj : error LNK2005: "public: float * __thiscall reprVectorsTree::decode(int *,int)" (?decode@reprVe
ctorsTree@@QAEPAMPAHH@Z) already defined in Dec.obj
我应该使用哪种视觉工作室项目设置?我觉得问题出在这里了? 要链接哪些文件?怎么链接?或者默认项目设置应该有效吗?
答案 0 :(得分:1)
错误消息告诉您在Dec.cpp
和decInterface.cpp
中定义了多个函数,或者在两个源文件包含的标头中定义了几个函数。通常,您只能在程序中使用单个函数定义;这是一个定义规则的一个方面。
如果定义都在两个源文件中,则将其从其中一个中删除。
如果它们在标题中,那么您可以选择。您可以将定义移动到一个(且只有一个)源文件中,只留下标题中的声明:
// header
class Node {
public:
Node(std::vector<float>); // declaration
};
// source
Node::Node(std::vector<float>) {
// definition
}
或者您可以在标题中定义它们inline
。这放松了规则,允许多个相同的定义:
// header
class Node {
public:
Node(std::vector<float>); // declaration
};
inline Node::Node(std::vector<float>) {
// inline definition
}
或者您可以在类定义中定义它们;这也使它们成为内联:
// header
class Node {
public:
Node(std::vector<float>) {
// inline definition
}
};