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

本文通过解决一个具体的C语言多文件编译问题,详细介绍了如何将声明与定义分离并正确链接,包括使用gcc的不同编译选项来生成目标文件及最终的可执行文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​​​​​​​先给解决方法

//test.h

#ifndef TEST_H
#define TEST_H

#include<stdio.h>
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的博客-优快云博客

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

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

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

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

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

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

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

最后还是解决了gcc编译选项-o和-c介绍_chengqiuming的博客-优快云博客_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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值