c ++单独编译,不同源文件使用的相同功能

时间:2014-01-13 03:18:58

标签: c++

谢谢大家,我已经尝试了你的建议,但它仍然没有用。我想简化我的问题然后再问一遍。
我在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

然后我有多个定义问题

4 个答案:

答案 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.h”

包括“my_lib.h”



my_class.cpp

包括“my_lib.h”


答案 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.cppmy_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

如果您收到有关未解析外部的错误,请检查您的函数的标题是否与其定义匹配。很有可能,在标题中声明的函数没有在任何地方定义,因为你犯了错字或其他错误。