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
本文围绕GCC和Makefile展开。GCC是C、C++、Objective - C的编译工具,介绍了.c和.h文件在同一目录及不同目录时的编译方法。Makefile可自动检测大型程序需重新编译部分,说明了其命名、格式,还举例展示了不同文件目录情况下编写Makefile编译生成程序的过程。
1037

被折叠的 条评论
为什么被折叠?



