安装GC:sudo apt-get inatall gcc
一、c文件的编译步骤

二、GCC指令
1. 创建本节的测试用例
创建".c"后缀的文件,文件中一般使用固定c框架的固定模板,这个是通过配置vim实现的,但是在上节中,我并未提到配置vim的方法,这里直接去搜索其他博主的教程即可。
创建之后的a.c文件内容如下,其中包含代码中所需要的所有包:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <mqueue.h>
#include <time.h>
#include <semaphore.h>
int main(int argc, char *argv[])
{
printf("Hello World\n");
return 0;
}
2. 分部编译与直接编译
(1)分部编译的命令
| gcc -E 文件名.c -o 文件名.i | 对.c程序文件进行预处理得到.i预处理文件 |
| gcc -S 文件名.i | 编译得到.s汇编文件 |
| gcc -c 文件名.s | 通过汇编得到.o机器码文件 |
| gcc 文件名.o | 通过链接得到.out可执行文件 |
| ./文件名.o | 运行 |
(2)直接编译的命令
| gcc 文件名.c | 使用gcc对程序进行编译,得到可执行文件的文件名为 文件名.out |
| ./文件名.o | 运行 |
(3)对测试用例的操作
通过对二、(1)中的文件执行一套编译流程,即分部编译,最终得到a.out可执行文件,编译过程如下:
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -E a.c -o a.i
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -S a.i
lyr@ubuntu:~/Desktop/GCCStudy$ ls
a.c a.i a.s
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -c main.s
gcc: error: main.s: No such file or directory
gcc: fatal error: no input files
compilation terminated.
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -c a.s
lyr@ubuntu:~/Desktop/GCCStudy$ ls
a.c a.i a.o a.s
lyr@ubuntu:~/Desktop/GCCStudy$ gcc a.o
lyr@ubuntu:~/Desktop/GCCStudy$ ls
a.c a.i a.o a.out a.s
lyr@ubuntu:~/Desktop/GCCStudy$ ./a.out
Hello World
上面的步骤是:先vim编辑好a.c文件的内容,先gcc -E预处理成“.i”结尾的c文件(当然这个c文件可以自己任意命名,带后缀是方便知道自己知道各个文件的性质);再通过“gcc -S”将c文件编译成“.s”结尾的汇编文件;通过“gcc -c”将该汇编文件翻译成机器语言(二进制文件);再将翻译后得到的“.o”文件链接成可执行文件“.out”,最后执行“./a.out”的命令运行该可执行文件,输出“Hello World”,至此大功告成!
上述过程在实际运用中,可通过直接编译以简化操作,过程如下:
lyr@ubuntu:~/Desktop$ gcc main.c
lyr@ubuntu:~/Desktop$ gcc main.c -o main
lyr@ubuntu:~/Desktop$ ./main
Hello World
这样,步骤就简化的很多了,也是大功告成!
注:在“.c”文件编辑时,一定要注意换行符的使用“\n”,如果没有可以使用换行符,那么得到的结果如下图:

三、 多c文件组织编译
1. 编译实例
(1) 在二、(1)的基础上进行修改,新的文件内容如下:
1 //省略头文件
14 //main.c
15 int main(int argc, char *argv[])
16 {
17 printf("Hello World\n");
18 thanks();
19 return 0;
20 }
(2) 增加文件thanks.c
1 #include <stdio.h>
2 //thanks.c文件
15 void thanks(){
16 printf("Thank you\n");
17 }
(3) 将两个文件一起编译。
lyr@ubuntu:~/Desktop$ gcc main.c thanks.c -o main
main.c: In function ‘main’:
main.c:18:5: warning: implicit declaration of function ‘thanks’ [-Wimplicit-function-declaration]
18 | thanks();
| ^~~~~~
lyr@ubuntu:~/Desktop$ ./main
Hello World
Thank you
上述结果中出现了“warning(警告)”的原因是:在main.c编译之前并没有看到thanks()的声明,所以这里会警告,没报错的原因是因为编译器会按照旧式C规则自动生成一个隐式声明。后来在链接阶段,连接器将main.o和thanks.o拼到一起,在符号表中真正找到了thanks的定义,左移链接成功,产生可执行文件main。
注:这里如果更新了main.c的内容,两个文件都需要重新编译。
2. ELF可执行文件
ELF(Executable Linkable Format,可执行可链接格式)。
目标文件通常按照特定格式进行组织,在Linux下,是通过对main.c和thanks.c链接得到的文件main得到ELF可执行文件进行组织的,通过“./main”的命令就可以将其运行起来。
2008

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



