Linux学习笔记:gcc和makefile简单使用

gcc和make

gcc

gcc是C,C++,Objective-C的编译工具。一般程序想要运行,必须编译为机器可以运行的文件。

常用指令作用
gcc -o file将输出放在file文件中,生成可执行文件
gcc -c生成目标文件.o
gcc -I dir在指定目录搜索头文件

当.c文件和使用的.h文件在一个目录下时(不包括标准目录的头文件)
比如:

$ tree
.
├── main.c
└── system.h

0 directories, 2 files
#main.c中调用了system.h的宏定义TIME=10
#main.c输出宏定义TIME

直接可以使用gcc -o生成可执行文件,也可以先gcc -c生成.o文件,再gcc -o生成可执行文件:

$ gcc main.c -o prog
$ ls
main.c	prog  system.h
$ ./prog
time=10
或者
$ gcc -c main.c
$ gcc main.o -o prog

如果有多个.c,则使用gcc 1.c 2.c -o prog
当.c文件和使用的.h文件不在一个目录下时(不包括标准目录的头文件)

$ tree
.
├── main.c
└── system
    └── system.h

1 directory, 2 files

此时如果直接输入$ gcc main.c -o prog,会出现错误。(找不到system.h这个文件)

main.c:2:10: fatal error: system.h: No such file or directory
    2 | #include "system.h"
      |          ^~~~~~~~~~
compilation terminated.

这时候必须输入gcc -I system/ main.c -o prog,即先用-I指定文件所在头文件的目录,比如system.h在system里面。

$ gcc -I system/ main.c -o prog
$ ls
main.c	prog  system
$ ./prog
time=10
或者
$ gcc -I system/ -c main.c
$ gcc main.o -o prog

makefile

make的主要功能是,执行生成新版本的目标程序所需的个步骤,即自动检测一个大型程序的哪一部分需要重新编译,然后发出命令,重新编译它们,主要是需要创建以一个makefile文件来连接他们,makefile文件通常以makefileMakefile,GNUmakefile命名。
makefile文件遵循的格式:

目标文件:[相依文件...]
<tab>命令[#注释]
目标文件:[相依文件...]
<tab>命令[#注释]
...

注意:的意思是在命令前面按一下键盘的tab键!!!
不然你makefile文件就是一个错误格式的文件,运行会报错。

举个makefile的栗子:
prog由main.o产生,main.o由main.c产生,
另外一行就是对应的生成命令。

prog:main.o
	gcc main.o -o prog
main.o:main.c
	gcc main.c -c

当.h文件和.c文件都在一个目录下时
当前目录下

$ tree
.
├── add.c
├── add.h
├── main.c
├── subtract.c
├── subtract.h
└── system.h

0 directories, 6 files

依赖关系为:

main.csystem.h add.c subtract.c
system.hadd.h subtract.h
add.cadd.h
subtract.csubtract.h

现在写一个makefile来编译生成prog。

prog:main.o add.o subtract.o
        gcc main.o add.o subtract.o -o prog
main.o:main.c system.h
        gcc -c main.c
add.o:add.c
        gcc -c add.c
subtract.o:subtract.c
        gcc -c subtract.c

运行结果:

$ make
gcc -c main.c
gcc -c add.c
gcc -c subtract.c
gcc main.o add.o subtract.o -o prog
$ ls
Makefile  add.h  main.c  prog	     subtract.h  system.h
add.c	  add.o  main.o  subtract.c  subtract.o
$ ./prog
num1=3,num2=1$ 

当.c和.h文件不在同一个目录下时:

$ tree
.
├── main.c
└── my_math
    ├── my_math.c
    └── my_math.h

1 directory, 3 files

依赖关系为:

main.cmy_math.c my_math.h
my_math.cmy_math.h

现在写一个makefile来编译生成prog。

prog:main.o my_math.o
        gcc my_math.o main.o -o prog
main.o:main.c my_math/my_math.h
        gcc -I my_math/ -c main.c
my_math.o:my_math/my_math.c
        gcc -c my_math/my_math.c

运行结果为:

$ make
gcc -I my_math/ -c main.c
gcc -c my_math/my_math.c
gcc my_math.o main.o -o prog
$ ls
Makefile  main.c  main.o  my_math  my_math.o  prog
$ ./prog
num1=3,num2=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月明Mo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值