链接两个.cpp和.h文件

时间:2011-08-11 20:54:52

标签: c++ linker

我正在做练习(来自C ++中Thinking的第三章),但我在链接两个.cpp文件时遇到问题。

这是练习:

  

创建一个头文件(扩展名为“.h”)。在这个文件中,   通过改变参数列表来声明一组函数   并从以下值中返回值:void,char,   int和float。现在创建一个包含你的.cpp文件   头文件并为所有这些创建定义   功能。每个定义都应该简单地打印出来   函数名,参数列表和返回类型等等   知道它被称为。创建第二个.cpp文件   包括你的头文件并定义int main(),   包含对所有功能的调用。编译并运行   你的计划。

我已经创建了三个文件,但是当我尝试编译编译器时给出了这个错误:

  

对`func1()'

的未定义引用      

对`func2(int)'|

的未定义引用      

对`func3(char,int,double)'|

的未定义引用      

对`func4()'|

的未定义引用      

|| ===构建完成:4个错误,0个警告=== |

为什么找不到函数声明?

## EDIT
这些是我的三个文件:

func_ex.h

void func1(void);
int func2(int i);
char func3(char c, int i, double d);
float func4(void);

func_ex.cpp

#include "func_ex.h"
using namespace std;

void func1(void) {
    cout << "void func1(void)" << endl;
}

int func2(int i) {
    cout << "int func2(int i)" << endl;
}

char func3(char c, int i, double d) {
    cout << "func3(char c, int i, double d)" << endl;
}

float func4(void) {
    cout << "func4(void)" << endl;
}

func_ex_main.cpp

#include "func_ex.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[]) {
    func1();
    int i;
    func2(i);
    char c; double d;
    func3(c, i, d);
    func4();
}

我使用GCC作为编译器(和Code :: Blocks作为IDE,但我认为这并不重要)。

8 个答案:

答案 0 :(得分:9)

听起来文件没有正确找到功能。头文件是否包含在两个文件中?你可以把它包括在内:

#include "myheader.h"

您确定要将两个文件一起编译吗?如:

gcc -o myprogram file1.cpp file2.cpp

答案 1 :(得分:7)

gcc -c func_ex.cpp -o func_ex.o
gcc func_ex_main.cpp func_ex.o -o func_ex_main

答案 2 :(得分:1)

看起来每个初学者都在经历这个(包括我自己), main.cpp中的包含.cpp文件,而不是.h

//func_ex_main.cpp
#include "func_ex.cpp" // instead of .h
#include <iostream>
using namespace std;
//etc...

因为.cpp通过该.cpp文件中的include链接到头部,并且每个函数定义在定义之前通过:: notation链接到减速。

请记住.h文件中的默认构造函数和析构函数是自动声明和定义的(如果你没有覆盖或重载它), 如果你只是在.cpp文件中重新定义它会导致编译错误, 所以,如果您不想覆盖它,请不要在构造函数中提及标题或源文件中的析构函数

答案 3 :(得分:0)

对于像我这样可能使用IDE BloodShed Dev C ++的人。

创建项目文件夹,然后继续将H文件和CPP文件放在项目文件夹中。

我遇到了与上面提到的相同的问题,我得出的结论是我的编译器只编译H文件,甚至不会读取链接到它的CPP文件。当我将它们放在项目文件夹中时,我的编译器会将所有文件编译在一起,从而允许我的代码运行。

以下是为使用Bloodshed的人创建项目文件夹的链接。

http://www.horstmann.com/bigcpp/help/bloodshed/index.html

至于其他IDE用户,我认为问题类似。 如果有人需要进一步阐述,请告诉我。

答案 4 :(得分:0)

我也使用code :: blocks,我遇到了同样的问题。 此IDE中的默认设置是仅构建一个文件。 这是我做的: 项目 - &gt;属性 - &gt;构建目标 - &gt;选择右下方相关的文件。 希望这有帮助!

答案 5 :(得分:0)

首先,如何在没有return语句的情况下使用func1(),func2(),func3()。尝试将标题正文放在这些内容中(#include guards):

#ifndef func_ex.h
#define func_ex.h
/* your code */

#endif 

答案 6 :(得分:-1)

我认为你的#include"func_x.cpp"

应该有func_main.cpp

答案 7 :(得分:-3)

你需要像这样包括:

#include "headerfilename.h"

位于每个.cpp文档的最顶部。