5 回答
TA贡献883条经验 获得超454个赞
在 C/C++ 中,程序代码要经过“编译”和“链接”后才能形成可执行程序。
编译:
一个源代码文件经过编译器编译后会生成带有可执行代码的文件(也就是编译器把你写的程序代码翻译为可运行的机器码),我这里说的源代码文件就是指 .cpp .c 之类的。这样被分别独立编译的代码一般被叫做一个“编译单元”。
你知道一个程序很可能有多个源代码文件,所以显然只这一个源代码文件生成的可执行代码是无法构成可完整运行的程序的。
链接:
当然了,每一个源代码文件都会经过编译器的编译,都生成了相应的可执行代码片段。有人称之为“中间文件”“过程文件”等,其文件名后缀在不同编译器下也不一样,微软的编译器生成的是 .obj,gcc 生成的是 .o。
前面说过一个编译单元生成的 .o 文件无法完整运行当然是因为 其中可能引用了其他编译单元中的变量 或者 调用了其他编译单元中的函数。所以为了能生成最终的可执行程序,就需要把这些编译单元的 .o 文件进行“链接”。
这是由链接器来处理的,它会找到不同编译单元中互相引用或互相调用的代码,处理好它们,并最终生成可执行程序。
以上就是你写的代码经过“编译”和“链接”生成可执行程序的过程。
所以你遇到的错误其实不是编译错误,而是链接错误。
你的 IDE 试图把 类外定义2.cpp 编译后就生成可执行程序,于是链接器就报了“找不到 getName 函数”等错误——因为这些函数是定义在另一个编译单元(Teacher.cpp)中的嘛。 同理,你在单独编译 Teacher.cpp 后链接器报的错是找不到 main 函数。
其实你需要把这两个编译单元(类外定义2.cpp 和 Teacher.cpp)的编译结果都交给链接器,而具体如何“交给”是你的 IDE 的事。
就像我在前面回答中所说,一般 IDE 都会以“工程”为单位来组织代码。你要把所有源码都放到“工程”中,这样 IDE 在链接时才知道到底有哪些代码要参与链接。
我猜你是没设置好这个“工程”。
TA贡献3593条经验 获得超0个赞
TA贡献11条经验 获得超8个赞
因为teacher.h中其实是没有包含teacher.cpp里的内容的,所以在最后main函数里会提示没有定义函数,需要把teacher.cpp里的函数拷贝到teacher.h里,之后再补全main里面用到的引用函数就可以运行
- 5 回答
- 1 关注
- 3013 浏览
添加回答
举报