栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言只包含头文件.h而不包含.c时无法通过编译,报错(函数未定义)undefine reference to ‘xxxxx‘

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言只包含头文件.h而不包含.c时无法通过编译,报错(函数未定义)undefine reference to ‘xxxxx‘

​​​​​​​先给解决方法
//test.h

#ifndef TEST_H
#define TEST_H

#include
void testprint();

#endif
//test.c

#include"test.h"

void testprint(){
    printf("test!!!!!!!!n");
    system("pause");
}
//main.c

#include"test.h"
int main(){
    testprint();
    return 1;
}

gcc -o main main.c test.c

两个文件放一起就好(过分简单。。。) 

---------------------------------------------------------------------------------------------------------------------------------

然后是我的萌新解决过程,大佬直接忽略吧

我以前一直把声明和定义都写在同一个文件,然后直接包含。但是都说要分开写,头文件.h写声明,.c写定义。参考以下帖子。

C语言中文件包含.c文件、.h文件与直接多文件的区别与应用总结_weixin_33795093的博客-CSDN博客

但我这么写后过不了编译,函数未定义。

问了师兄也得不到解决,网上找答案找了好久,不是说网上没答案,而是太乱了,众口纷纭,不知道哪个是答案。而且不知道搜什么关键词,太痛苦了。倒是找到了同样的问题 

我用的VSC,怀疑是IDE问题,换了codeblock甚至直接gcc都不行。

然后又去看stdio.h源码,发现标准库也是把声明写在头文件,里面根本没有定义。为什么#include就能直接用呢,(到现在已经有线索了)标准库函数的实现写在了别的文件并且已经编译了,编译main的时候,自动链接了其实现。

那么自己写的非标准库怎么办呢,该如何手动链接。

 我去看了编译过程(这个到处都有),参考这个C/C++语言编译链接过程 - 知乎

我把每个过程的文件都留下还是不行。

最后还是解决了gcc编译选项-o和-c介绍_chengqiuming的博客-CSDN博客_gcc-o

gcc -c main.c test.c

或者

gcc -c main.c

gcc -c test.c

这行的意思是生成二进制目标文件main.o 和 test.o  分开写也行。-c参数是让编译过程执行到汇编就停止

 gcc -o main main.o test.o

这行是生成可执行文件,手动链接main.o,test.o(我猜的),平时编译都直接gcc -o main main.c,少了非标准库的链接,所以执行不了。

两行加起来跟一行是等效的

gcc -o main main.c test.c

---------------------------------------------------------------------------------------------------------------------------------

这个问题疑惑了好多人,我甚至翻到2006年的帖子。。但是解决方法都语焉不详,书上也没写,学校教零基础甚至直接上IDE,我觉得无论学啥都得从记事本和命令行开始吧,先明白了原理扎实了基础再用提供方便的IDE。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779143.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号