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文件通常以makefile和Makefile,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.c | system.h add.c subtract.c |
---|---|
system.h | add.h subtract.h |
add.c | add.h |
subtract.c | subtract.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.c | my_math.c my_math.h |
---|---|
my_math.c | my_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