总述:
一、编译器(gcc):简单、不常用、Linux独家播出
二、调试器(gdb):最常用,不建议新手使用
三、工程管理器:最重要、最难
四、Shell编程:与Python异曲同工、脚本语言
接触到新的东西,一开始总是痛苦的,因为又要和一些冰冷的名词打交道了。我发现很多学科,特别是计算进相关学科,入门的关键就是对一些名词的熟悉;Linux开发工具也不例外,下面由我来一一道来今晚老师给我们讲述的内容:
gcc:GNU项目中符合ANSI C标准的编译系统;
1、 一个交叉平台的编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件:(gcc可以为x86、ARM、MIPS、DSP等不同体系结构的硬件平台编译程序)
2、 gcc可以编译c、c++、Pascal、Java等数十种高级语言
3、 交叉平台编译出现的原因:不同的机器有各自不同的汇编,不同的汇编生成各自不同的机器码,即各个平台上的可执行文件不能兼容运行。(做系统移植时的重要概念)
file命令可以对文件进行属性的查看
4、 编译过程:
(1)预处理(pre-processing)
(2)编译(compiling)
(3)汇编(assembling)
(4)链接(linking)
5、对编译过程展开叙述:
预处理的内容:
A、 宏替换
B、 头文件展开
C、 条件编译(#ifndef#else #endif/#ifdef #else #endif)
系统存放头文件目录:/root/usr/include/
C语言中“”””和“<>”的去别:
“”””:先在当前目录中寻找头文件,若没找到,再去系统头文件目录中寻找头文件,若没找到,则报错;
“<>”:直接在系统头文件目录中寻找头文件,若没找到,直接报错。
1)、“-E”:gcc –E “文件名”,只对该文件进行预处理操作
“>”重定向符号:可以将与处理之后的结果放入指定的文件内
[root@localhost1112]# gcc -E hello.c > hello.1
[root@localhost1112]# ls
hello.1 hello.c
(大段注释方法:#if 0 #endif\除去注释方法:#if 1#endif)
编译的内容:
A、 语法检查;
B、 词法分析
中间代码:介于源语言与目标文件之间的代码
编译——>得到目标文件(~.o)
2)、“-c”:gcc –c 文件名,对文件只进行到编译步骤
[root@localhost1112]# ls
hello.1 hello.c
[root@localhost1112]# gcc -c hello.c
[root@localhost1112]# ls
hello.1 hello.c hello.o
汇编的过程:把目标文件(.o)汇编成符合硬件平台的汇编文件(.s)
3)、gcc –S “文件名”
[root@localhost1112]# gcc -S hello.c
[root@localhost1112]# ls
hello.1 hello.c hello.o hello.s
4)、gcc “源文件名” –o “指定可执行文件名”
(rm –f 文件.*:删除一类文件)
5)、time ./“可执行文件”:显示编译时间
代码一级优化:
[root@localhostoptimize]# gcc -O1 optimize.c -ooptimize.out1
[root@localhostoptimize]# ls
optimize.c optimize.out1
[root@localhostoptimize]# time ./optimize.out1
c = 2131407304
real 0m0.004s
user 0m0.000s
sys 0m0.003s
代码二级优化:
[root@localhostoptimize]# gcc -O2 optimize.c -ooptimize.out2
[root@localhostoptimize]# ls
optimize.c optimize.out1 optimize.out2
[root@localhostoptimize]# time ./optimize.out2
c = 2133263240
real 0m0.002s
user 0m0.000s
sys 0m0.002s
代码三级优化:
[root@localhostoptimize]# gcc -O3 optimize.c -ooptimize.out3
[root@localhostoptimize]# ls
optimize.c optimize.out1 optimize.out2 optimize.out3
[root@localhostoptimize]# time ./optimize.out3
c = 2141432680
real 0m0.003s
user 0m0.000s
sys 0m0.003s
其他编译选项:
1、-w:关掉所有警告:
2、-Wall:打开所有警告:
3、-I:指定头文件的第三方搜索路径:
4、-D:从外部向文件中加入宏定义:
动态库与静态库:
库:库文件中保存了一些函数和变量,我们可以使用这些函数和变量,但是我们无法看到这些文件和变量的源代码;
Linux的库分为:静态库、动态库(共享库)
库的存放地址(/root/lib、/usr/lib)
静态库:是在执行程序之前就已经加入到执行代码中,成为执行程序的一部分来执行的,后缀名:.a
动态库:是在执行程序启动时加载到执行代码中,后缀名:.so
静态库与动态库的不同:
1、 执行速度:静态库所生成的的可执行文件的执行速度比动态库所生成的可执行文件的执行速度快;
2、 编译耗时:静态库编译时耗费时间比动态库编译耗费时间多;
3、 静态库所生成的可执行文件比动态库所生成的可执行文件大;
4、 动态库容易对代码进行升级;
动态库和静态库的制作与使用:
1、 静态库的制作与使用:
“-c”编译:gcc –c 源文件->目标文件
ar rcs lib~.a 目标文件
gcc main.c –l库
“-l”:链接指定库;
“-L”:指定库的路径;
2、 动态库的制作与使用:
3、 “-c”编译:gcc –c 源文件->目标文件
gcc –shared –fPIC –o lib~.so ~.c
gccmain.c /../lib~.so –o ~