阿里巴巴网站上面产品描述一般怎么做的,wordpress部署云,百度软文推广怎么做,常见网页制作软件1 前言
1.1 环境 平台#xff1a;uabntu20.04 工具#xff1a;vim,gcc,make
1.2 GCC Linux系统下的GCC#xff08;GNU Compiler Collection#xff09;是GNU推出的功能强大、性能优越的多平台编译器#xff0c;是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执…
1 前言
1.1 环境 平台uabntu20.04 工具vim,gcc,make
1.2 GCC Linux系统下的GCCGNU Compiler Collection是GNU推出的功能强大、性能优越的多平台编译器是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器其执行效率与一般的编译器相比平均效率要高20%~30%。
GCC编译器能将C、C语言源程序、汇程式化序和目标程序编译、链接成可执行文件如果没有给出可执行文件的名字gcc将生成一个名为a.out的文件。
GCC编译器编译C源文件为可执行文件的步骤
C源文件—-预处理.i—-编译.s生成汇编文件—-汇编.o/.obj生成目标文件—-链接.out生成可执行文件—-可执行文件 gcc命令参数选项
参数 含义 示例
参数含义示例-c对文件进行预处理、编译和汇编生成obj文件 gcc -c hello.c-S 只进行预处理和编译生成汇编代码gcc -S hello.c-E只进行预处理这个选项不生成文件可以使用重定向或者-o选项使其生成一个文件 gcc -E hello.c hello.i或者gcc -E hello.c -o hello.i-o 指定目标的名称默认为a.outgcc -o hello hello.c 过程演示
例如源代码main.c
#includestdio.hint main(void) {printf(Hello World!\n);return 0;
} 预编译这个过程处理宏定义和include去除注释不会对语法进行检查。可以看到预编译后源文件的代码从6行扩展了很多行生成main.i
gcc -E main.c main.i # 或者 gcc -E main.c -o main.i
// ...
// 只展示了一部分
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ;extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 943 /usr/include/stdio.h 3 4# 2 main.c 2
int main(void) {printf(Hello World!\n);return 0;
} 编译这个阶段检查语法生成汇编代码main.s
gcc -S main.c -o main.s .file main.c.section .rodata
.LC0:.string Hello World!.text.globl main.type main, function
main:
.LFB0:.cfi_startprocpushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6movl $.LC0, %edicall putsmovl $0, %eaxpopq %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size main, .-main.ident GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44).section .note.GNU-stack,,progbits 汇编这个阶段生成目标代码main.o
gcc -c main.s -o main.o 链接生成可执行代码main。 链接分为两种一种是静态链接另外一种是动态链接。 使用静态链接的好处是依赖的动态链接库较少对动态链接库的版本不会很敏感具有较好的兼容性缺点是生成的程序比较大。 使用动态链接的好处是生成的程序比较小占用较少的内存。 gcc main.o -o main 运行
[rootHongyiZeng c]# ./main
Hello World! 1.3 make
make命令是GNU工程化中的一个编译工具。make是依赖于Makefile来编译多个源文件的工具。在Makefile里同样是用gcc或者别的编译器来编译程序。
可以使用以下命令直接生成可执行文件
make main
直接运行
[rootHongyiZeng c]# ./main
Hello World! 1.4 makefile
一个工程中的源文件不计其数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作。 1.4.1 使用gcc的例子
创建文件
touch main.c tool1.c tool1.h tool2.c tool2.h
可以使用vim * -p打开当前目录下的所有文件。-p是打开多个文件的选项。
在命令模式下gt切换到下一个标签页gT切换到上一个标签页。
退出多个标签时可加上a例如:qa或者:wqa等
tool1.h和tool1.c
#ifndef __TOOL1_H__
#define __TOOL1_H__void mytool1();
#endif
#include stdio.h
#include tool1.h
void mytool1() {printf(tool1 print...\n);
}
tool2.h和tool2.c
#ifndef __TOOL2_H__
#define __TOOL2_H__void mytool2();
#endif
#include stdio.h
#include tool2.hvoid mytool2() {printf(tool2 print...\n);
}
main.c
#include tool1.h
#include tool2.hint main(void) {mytool1();mytool2();return 0;
}
对所有文件进行编译
gcc *.c
执行a.out
[rootHongyiZeng makefile]# ./a.out
tool1 print...
tool2 print...