谢谢大家,我已经尝试了你的建议,但它仍然没有用。我想简化我的问题然后再问一遍。
我在ubuntu 12.04上使用eclipse
我把这三个文件放在同一个c ++项目文件夹中
我有三个文件,main.cpp,my_lib.cpp,my_lib.h
我做:
//main.cpp
#include "my_lib.h"
// using functions from my_lib.cpp
//my_lib.cpp
#include "my_lib.h"
// defining functions
然后我有错误:未定义对函数的引用
如果我做:
我这样做:
//main.cpp
#include "my_lib.h"
#include "my_lib.cpp"
// using functions from my_lib.cpp
//my_lib.cpp
#include "my_lib.h"
// defining functions
然后我有多个定义问题
答案 0 :(得分:1)
以下是如何设置它的方法。包含.cpp文件是不好的编程习惯。相反,您应该只在.cpp文件中包含.h文件。多重定义错误来自您在同一文件中定义my_lib.h和my_lib.cpp。您需要做的就是调用实现,并且已经调用了.cpp文件,因为在my_lib.cpp和my_class.cpp中应该在顶部有各自的标题。例如:my_lib.cpp应该在顶部有my_lib.h。 my_class.cpp应该有my_lib.h。在main.cpp中,您需要做的就是调用.h文件。与my_class.cpp相同。下面给出了你应该如何设置它。
的main.cpp
my_class.cpp
答案 1 :(得分:1)
您不在C ++中包含.cpp文件,因为.cpp文件包含定义,而C ++有一条规则,您无法定义函数两次。
顺便说一下,
//This is declaration, normally in .h file
int sum(int a, int b);
//This is definition, normally in .cpp file
int sum(int a, int b) { return a + b; }
如果你包含.cpp文件,你肯定会多次定义sum函数。
您可以包含.h文件,因为C ++允许多次声明函数。
对于您的问题,您应该包含“my_lib.h”。
如果未在my_lib.h中声明my_lib.cpp中定义的函数,则应在my_lib.h中声明一个函数。
如果你无权修改my_lib.h,那么这意味着my_lib.cpp中的函数不应该在my_lib.cpp之外使用,你需要重新考虑你的设计。
答案 2 :(得分:1)
文件my_lib.cpp
包含函数定义。
在第一种情况下,您将其添加到main.cpp
和my_class.cpp
中。这两个模块现在包含相同的定义。因此,链接器会发出错误,因为它不知道要使用哪些函数。你打破了一个定义规则。
在第二种情况下,您没有在my_lib.cpp
中包含my_class.cpp
,并且只生成了一次函数的目标代码。
您不应将一个cpp模块包含在另一个模块中。您应该只包含标题。
正确的项目将采用以下方式
// main.cpp
#include "my_class.h"
#include "my_lib.h"
// my_class.cpp
#include "my_class.h"
#include "my_lib.h"
// use functions inside my_lib.cpp
// my_lib.cpp
#include "my_lib.h"
编辑:改变原帖后,这是一个坏主意。我认为问题在于您没有为链接器指定所有模块。
答案 3 :(得分:0)
您可能知道,您不能将一个.cpp文件包含到另一个文件中,因为这会导致链接器出现多个定义错误。现在,正确的方法是在头文件中放置声明:
//Utility.h
void utility_func();
定义它的主体是源文件:
//Utility.cpp
void utility_func()
{
//...
}
并在其他来源中使用它。为此,您可以:
<强> 1。包含包含声明的标题:
#include "Utility.h"
<强> 2。手动声明功能:
extern void utility_func(); //extern is optional here and assumed by default
如果您收到有关未解析外部的错误,请检查您的函数的标题是否与其定义匹配。很有可能,在标题中声明的函数没有在任何地方定义,因为你犯了错字或其他错误。