Linux开发工具
编译器-gcc
gcc编译器的特点
预处理
主要用于头文件展开,宏替换,条件编译
编译器只做预处理操作,预处理不做语法检查。命令为:gcc -E ***.c > ***.i(>重定向)
我们所见过的头文件(系统的)目录都在cd /user/include/
系统自带的头文件目录<>;我们自己创建的头文件“ ”,程序执行的时候现在当前执行目录下进行查找,查找不到再去系统头文件目录下查找,如果在查找不到就报错。
全用“”编译效果慢
编译
主要用于语法检查、词法分析
编译阶段停止,生成.o结尾的目标文件 命令:gcc -c 源文件名.c
汇编
主要用于把编译产生的目标文件转换成编译文件
汇编阶段停止 命令:gcc -S 源文件名.c
链接
生成符号表,用连接器把生成的目标代码和系统或用户提供的库连接起来,生成可执行文件
命令:gcc
编译器的其他一些指令
给可执行文件a.out 重起名字
命令:gcc 源文件名.c -o 可执行文件名
使用通配符*全部以某文件为前缀或后缀的文件全部删除
rm -f 文件名.*
统计文件处理时间
time ./可执行文件名
多个文件的编译
gcc 源文件名1.c 源文件名2.c。。。-o 可执行文件名
去掉所有警告
gcc -w 源文件名.c -o 可执行文件名
开启警告
gcc -Wall 源文件名.c -o 可执行文件名
,h也就是声明函数不在同一个文件目录下
编译器静态编译 static
在编译时,程序会优先选择动态库(但移植的话,动态库也要拷??)以依赖动态库+static优先选择静态库
库
静态库和动态库的制作和使用
libc.a/libc.so普通库 libm.a/libm.so数学库
使用数学库命令:gcc 主函数名.c -lm
编译器-gcc
gcc编译器的特点
1、可以编译多种语言
2、是一款交叉编译器(在一个CPU平台下的编译可以在另一个CPU平台下运行,即gcc能够在当前CPU 平台上为多种不同体系结构的硬件平台开发软件)
编译器的编译过程预处理
主要用于头文件展开,宏替换,条件编译
编译器只做预处理操作,预处理不做语法检查。命令为:gcc -E ***.c > ***.i(>重定向)
我们所见过的头文件(系统的)目录都在cd /user/include/
系统自带的头文件目录<>;我们自己创建的头文件“ ”,程序执行的时候现在当前执行目录下进行查找,查找不到再去系统头文件目录下查找,如果在查找不到就报错。
全用“”编译效果慢
编译
主要用于语法检查、词法分析
编译阶段停止,生成.o结尾的目标文件 命令:gcc -c 源文件名.c
汇编
主要用于把编译产生的目标文件转换成编译文件
汇编阶段停止 命令:gcc -S 源文件名.c
链接
生成符号表,用连接器把生成的目标代码和系统或用户提供的库连接起来,生成可执行文件
命令:gcc
编译器的其他一些指令
给可执行文件a.out 重起名字
命令:gcc 源文件名.c -o 可执行文件名
使用通配符*全部以某文件为前缀或后缀的文件全部删除
rm -f 文件名.*
统计文件处理时间
time ./可执行文件名
多个文件的编译
gcc 源文件名1.c 源文件名2.c。。。-o 可执行文件名
编译器优化
gcc -O1 源文件名.c -o 可执行文件名1
基本优化,对代码分支、表达式、常量进行优化,在较短时间内将代码变得短小,降低内存占用率。但当一个庞大的程序细化拆分,反而会增加内存占用,系统会出现卡顿延迟。
gcc -O2 源文件名.c -o 可执行文件名2
进阶优化,进行更严格的细分,加入了寄存器的使用,虎将程序运行中的一些结果存放在寄存器中,提高效率。但是寄存价格昂贵,数量有限,一般不会存放在寄存器中。另一种将代码放入寄存器的方法是使用register修饰变量,便于频繁调用
gcc -O3 源文件名.c -o 可执行文件名3
非常强大,编译器会进行预测,会对循环结构中每一层进行预测,以便于拆分提高执行效率,用已有值替换未知值,用+替换*。缺点是会出现误差,导致程序错误和不可逆转的走向。一般不建议使用。
去掉所有警告
gcc -w 源文件名.c -o 可执行文件名
开启警告
gcc -Wall 源文件名.c -o 可执行文件名
,h也就是声明函数不在同一个文件目录下
编译器静态编译 static
在编译时,程序会优先选择动态库(但移植的话,动态库也要拷??)以依赖动态库+static优先选择静态库
库
静态库和动态库的制作和使用
libc.a/libc.so普通库 libm.a/libm.so数学库
使用数学库命令:gcc 主函数名.c -lm