You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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大小写敏感,注意区分目录名、文件名的拼写。

三、新手友好的完整编译步骤

别直接一步链接,分步来不容易错:

  1. 先创建必要的目录(如果还没建):
    mkdir -p ./temp ./bin
    
  2. 分别编译每个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
    
  3. 最后链接所有目标文件生成可执行文件:
    g++ -o ./bin/linuca ./temp/main.o ./temp/utils.o ./temp/io.o
    

内容的提问来源于stack exchange,提问作者lkrkerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:54:20