我正在做练习(来自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,但我认为这并不重要)。
答案 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文档的最顶部。