使用makefile编译C语言文件遇到的问题

43 篇文章 4 订阅

    第二个问题是关于makefie的。众所周知,使用makefile可以对多个源文件进行编译,非常的方便简捷。但是在学习的过程中我遇到了一些小问题。我不明白使用makefile和在main函数所在的文件直接incldue其它文件的区别。

    于是在使用中我自己创建了几个小文件,便搞懂了这个问题。

    首先先举两个例子

    第一个例子:


file1.c:

#include "stdio.h"

void main()
{
    int a;
    printf("please input the number:\n");
    scanf("%d",&a);
    printf("square(a)=%d\n",square(a));                               
}


file2.c:

#include "stdio.h"

int square(int x) 
{
    return x*x;                                                                                      
}


    makefile文件


 
    显然第一个例子是可以运行的
    第二个例子:

file1.c
#include<stdio.h>
#include"file2.c"

int g=3;

int main(void)
{
    int s,y;
    s=g*g*g;
    y=sum(g,s);
    printf("%d%d\n",s,y);
}

file2.c
#include<stdio.h>
int sum(int e,int f)
{
    return e+f;
}


   相同如果仍然用上面的makefile文件,便不会运行成功程序会报错说
gcc -cfile1.c
gcc file1.o file2.o -o file12
file2.o:在函数‘sum’中:
file2.c:(.text+0x0): multiple definition of `sum'
file1.o:file1.c:(.text+0x0):第一次在此定义
collect2: 错误:ld 返回 1
make: *** [file12] 错误 1

     在查找了一些关于C语言编译的知识后,我终于解决了这个问题。
 

    最重要是要明白一点:只要是一个c语言源文件,不管在代码中是否存在错误都可以生成目标文件。
 

    在linux上编写程序时,可以使用makefile来完成一个工程的编译,并且需要分为多步。
 
 
    首先我们将相关功能的函数组织在一个文件中形成属于项目的函数库,然后我们把每个文件gcc-c编译为独立的.o目标文件,最后统一
链接生成可执行文件。

   
而正是在链接这一步起到了关键作用,即使在主函数所在文件中没有include其他文件,但是已经把各个文件链接在了一起,同样能够生成可执行文件。
 

    如果不使用makefile的话,就需要对主函数存在的文件开头中加上include所调用函数所在的文件,这样才能使编译不报错。

    而在例二中,使用make命令后就已经对该文件进行了链接,所以在文件开头处不用incldue其他的文件,否则将是重复的定义。

    当然也可以在源文件加入其他头文件进行编译,不过需要在编写makefile文件时同时把.h文件加入到编译语句中。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daijingxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值