Linux中.c程序的编译和运行(gcc -c main.c 和gcc main.c -o main)

一、在Linux命令行中用vim编写四个函数分别执行加减乘除四个功能(.h头文件包含函数的声明,这些声明在.c文件中实现。)

        1.1add.h

#ifndef ADD_H
#define ADD_H

int add(int a,int b);

#endif

        1.2add.c

#include <stdlib.h>
#include "add.h"

int add(int a,int b){
 return a+b;
}


        2.1diff.h

#ifndef DIFF_H
#define DIFF_H

int diff(int a,int b);

#endif


        2.2diff.c

#include "diff.h"

int diff(int a,int b){
        return a-b;
}


        3.1mul.h

#ifndef MUL_H
#define MUL_H

int mul(int a,int b);

#endif


        3.2mul.c

#include "mul.h"

int mul(int a,int b){
        return a*b;
}


        4.1div.h

#ifndef DIV_H
#define DIV_H

double div(int a,int b);

#endif

        4.2div.c

#include <stdio.h>
#include "div.h"
#include <math.h>

double div(int a,int b){
        if (b=0){
                printf("cuowu:b=0!");
                return 0;
        }else{
                return (double)a/b;
        }
}


二、编写main.c源文件,在main.c中调用add()、diff()、mul()和div()函数分别计算任意两个数的和、差、积、商

main.c文件代码

#include <stdio.h>
#include "add.h"
#include "diff.h"
#include "mul.h"
#include "div.h"

int main(){
        int a=99;
        int b=3;
        int sum = add(a,b);
        int cha = diff(a,b);
        int cheng = mul(a,b);
        double chu = div(a,b);
        printf("%d + %d = %d\n",a,b,sum);
        printf("%d - %d = %d\n",a,b,cha);
        printf("%d * %d = %d\n",a,b,cheng);
        printf("%d / %d = %.2f\n",a,b,chu);
        return 0;
}

三、运行代码

1.直接运行main.c发现报错(在Linux中要用gcc编译后才能运行,这里的权限不够用chmod加上x权限一样不行)

ygy@ubuntu:~/GCC/124ygy$ ./main.c
bash: ./main.c: 权限不够

2.编译各.c文件(编译后出现各.c文件的.o文件)

ygy@ubuntu:~/GCC/124ygy$ gcc -c *.c
ygy@ubuntu:~/GCC/124ygy$ 

2.编译后运行错误尝试

        添加权限:chmod +x main.c

ygy@ubuntu:~/GCC/124ygy$ chmod +x main.c
ygy@ubuntu:~/GCC/124ygy$ ./main.c
bash: ./main.c: 权限不够

        gcc main.c -o main发现未定义

ygy@ubuntu:~/GCC/124ygy$ gcc main.c -o main
/tmp/ccdQ9WIC.o:在函数‘main’中:
main.c:(.text+0x21):对‘add’未定义的引用
main.c:(.text+0x33):对‘diff’未定义的引用
main.c:(.text+0x45):对‘mul’未定义的引用
collect2: error: ld returned 1 exit status

         gcc -o main.o和gcc -c fibo.c

ygy@ubuntu:~/GCC/124ygy$ gcc -o main.o
gcc: fatal error: no input files
compilation terminated.
ygy@ubuntu:~/GCC/124ygy$ gcc -c fibo.c
gcc: error: fibo.c: 没有那个文件或目录
gcc: fatal error: no input files
compilation terminated.

           gcc main.c -o main

ygy@ubuntu:~/GCC/124ygy$ gcc main.c -o main
/tmp/cc7ZKa2Z.o:在函数‘main’中:
main.c:(.text+0x21):对‘add’未定义的引用
main.c:(.text+0x33):对‘diff’未定义的引用
main.c:(.text+0x45):对‘mul’未定义的引用
collect2: error: ld returned 1 exit status

3.原来是要将函数和main.c链接

ygy@ubuntu:~/GCC/124ygy$ gcc -c add.c -o add.o
ygy@ubuntu:~/GCC/124ygy$ gcc -c diff.c -o diff.o
ygy@ubuntu:~/GCC/124ygy$ gcc -c mul.c -o mul.o
ygy@ubuntu:~/GCC/124ygy$ gcc -c div.c -o div.o

4.运行main 

ygy@ubuntu:~/GCC/124ygy$ gcc main.c add.o diff.o mul.o div.o -o main
ygy@ubuntu:~/GCC/124ygy$ ls
add.c      add.o   diff.h.gch  div.h      main    mul.c      mul.o
add.h      diff.c  diff.o      div.h.gch  main.c  mul.h
add.h.gch  diff.h  div.c       div.o      main.o  mul.h.gch
ygy@ubuntu:~/GCC/124ygy$ ./main
99 + 3 = 102
99 - 3 = 96
99 * 3 = 297
99 / 3 = inf

四、回顾

1.编写函数后要用gcc将各文件编译,编译后出现.o文件,然后要将.o文件与main.c文件链接,链接后出现main,然后直接用./main就可以调用函数进行计算 

2.gcc main.c -o main命令报错:

/tmp/cc7ZKa2Z.o:在函数‘main’中: main.c:(.text+0x21):对‘add’未定义的引用 main.c:(.text+0x33):对‘diff’未定义的引用 main.c:(.text+0x45):对‘mul’未定义的引用 collect2: error: ld returned 1 exit status

这个错误信息表示在编译main.c文件时,链接器找不到adddiffmul这三个函数的定义。这通常是因为这些函数的声明和定义没有在main.c文件中,或者它们不在链接器能够找到的库或源文件中。

要解决这个问题,需要确保以下几点:

  1. 确保您已经正确地编写了add.cdiff.cmul.c和相应的头文件(如add.hdiff.hmul.h),并且这些文件已经被正确地编译成目标文件或库文件。如没有要用以下代码编译(例)
    gcc -c add.c -o add.o  
    gcc main.c add.o -o main
  2. 在编译main.c文件时,确保将编译这些函数的命令一起执行。这样可以将它们编译成目标文件,并且链接器可以找到它们。

    这样,链接器就可以找到add函数的定义,并且不会出现未定义的引用错误。

  3. 如果这些函数是在其他库文件中定义的,确保在编译时链接到这个库文件。
  4. 确保您没有重复声明或定义这些函数,因为这可能导致链接器混淆。
  5. 完成上述步骤后,您可以运行main.c文件。在终端中,使用以下命令来编译和运行main.c文件:

    gcc main.c add.o diff.o mul.o -o main  
    ./main

    这将编译main.c文件以及之前编译的目标文件(add.o、diff.o和mul.o),并将可执行文件命名为main。然后,运行main文件,它将执行程序并打印结果。

    请确保在运行命令时,所有编译生成的目标文件(add.o、diff.o和mul.o)都在当前目录中,以便链接器可以找到它们并将它们链接到可执行文件中。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值