g++链接报错:function多重定义求助(未在头文件定义函数)
问题排查与解决
一、搞定start() 多重定义的问题
这问题大概率是下面几个情况,挨个查:
- 再核对一遍
settings.h:别以为没写函数定义,说不定手滑把void start();写成了带大括号的void start() {}——头文件里写函数体就是定义,每个包含它的cpp都会编译一份,链接时就会报多重定义。确保头文件里只有纯声明:void start(); - 给头文件加上保护:防止重复包含出问题,把
settings.h改成这样:#ifndef SETTINGS_H #define SETTINGS_H void start(); void in(); void out(); #endif // SETTINGS_H - 扫一遍所有cpp文件:确认只有
utils.cpp里写了start()的函数体,io.cpp和main.cpp里千万别重复写这个函数的实现。
二、解决undefined reference to main错误
链接器找不到main函数,肯定是这几个原因:
- 打开main.cpp看看:有没有写正经的
main函数?比如得是int main() { ... return 0; }这种,别漏了,也别写错名字(比如写成Main或者MAIN)。 - 检查
./temp/main.o存在不:运行ls ./temp看看有没有这个文件,要是没有,先单独编译main.cpp:g++ -c main.cpp -o ./temp/main.o - 核对编译命令里的路径:别把
./temp/main.o写错了,Linux大小写敏感,注意区分目录名、文件名的拼写。
三、新手友好的完整编译步骤
别直接一步链接,分步来不容易错:
- 先创建必要的目录(如果还没建):
mkdir -p ./temp ./bin - 分别编译每个cpp文件成目标文件:
g++ -c main.cpp -o ./temp/main.o g++ -c utils.cpp -o ./temp/utils.o g++ -c io.cpp -o ./temp/io.o - 最后链接所有目标文件生成可执行文件:
g++ -o ./bin/linuca ./temp/main.o ./temp/utils.o ./temp/io.o
内容的提问来源于stack exchange,提问作者lkrkerry
相关产品推荐
相关产品推荐

