链接两个.cpp和.h文件

Ove*_*owh 8 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);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

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

sam*_*moz 10

听起来好像文件没有找到适当的功能.头文件是否包含在两个文件中?你可以把它包括在内:

#include "myheader.h"
Run Code Online (Sandbox Code Playgroud)

你确定一起编译这两个文件了吗?如:

gcc -o myprogram file1.cpp file2.cpp

  • 这将导致编译器错误,而不是所描述的链接器错误. (3认同)

xda*_*001 7

gcc -c func_ex.cpp -o func_ex.o
gcc func_ex_main.cpp func_ex.o -o func_ex_main
Run Code Online (Sandbox Code Playgroud)


小智 6

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

//func_ex_main.cpp
#include "func_ex.cpp" // instead of .h
#include <iostream>
using namespace std;
//etc...
Run Code Online (Sandbox Code Playgroud)

因为 .cpp 通过该 .cpp 文件中的包含链接到标题,并且每个函数定义通过定义之前的 :: 符号链接到减速。

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