目录
C语言只能使用gcc/g++
C++只能使用g++
左边的w是warning,因为你定义了sum,还没有使⽤,⽤了sum就不不会有了。
(语法检查) 在编译。
这样⼀串代码时可能会报错,这样加上就可以了。因为编译器版本⽼了。
这样编译出来的名字都是a.out,如果要按⾃⼰想的就要这样写:
-o 的意思是,直接⽤源⽂件编译形成⾃定义可执⾏程序
使⽤g++也可以对c语⾔的代码进⾏编译,跟IDE⼀样
C++的源⽂件名有很多写法
.cpp/.cc/.cxx
⽤gcc编译c++的代码发现编译不过去了。就是因为gcc只能编译c语⾔的。
程序的翻译 C语⾔的源⽂件经过翻译成为可执⾏⽂件,经历了以下⼏个阶段:
C源⽂件 -> 预处理 -> 编译 -> 汇编 -> 链接 -> 可执⾏程序
-
预处理
1.头⽂件展开(把头⽂件内容直接拷⻉到源程序,头⽂件⾥写的其实就是函数的声明)
2.去注释
3.条件编译(通过条件编译,可以实现对代码的动态裁剪!)
4.宏替换
-
编译
c -> 汇编
-
汇编
汇编 -> 可重定为⼆进制⽂件
-
链接
形成可执⾏
验证以上的概念:
-
预处理(-E)
gcc -E [⽂件名(code.c)]
就会直接把预处理的结果显示到显示器上,但是显示器上打太麻烦了
gcc -E code.c -o code.i
这样可以把结果放在⼀个临时⽂件中,这个⽂件⼀般为.i
-E:从现在开始,帮我进⾏程序的翻译,等预处理完成后,就停下来,别往后继续⾛了!
-
汇编(-S)
gcc -S code.i(.c也可以只是要再⾛⼀次预处理) -o code.s
-S:从现在开始进⾏程序的翻译,等编译⼯作做完,就停下来!
-
可重定位⼆进制⽂件(-c)
gcc -c code.s -o code.o
-c:汇编做完就停下来,做完已经是⼆进制了
vim打开是乱码,查看他要⽤⼆进制⼯具,⽐如od(这个code.o)并不能执⾏
od code.o
然后再
*.0(所有的点o⽂件) + 系统库 = 可执⾏程序
gcc code.o 就可以直接链接形成a.out
理解⼀下,引⼊新概念:动静态库
这⾥就是函数的头⽂件存放的位置,相当于函数的声明
ldd 指令,可以直接看到⼀个可执⾏程序他所依赖的第三⽅库的信息。(函数的实现)
代码 + 头⽂件 + 库 =可执⾏程序
以上都是⽂件!所以,所谓的开发环境安装,⼀定要做什么⼯作?怎么理解?安装下载并拷⻉头⽂件和库⽂件到开发 环境中的特定路径下,⼀定要能被编译器⾃⼰找到!
库的命名:libc.so.6
库必须以lib开头so表示类别是动态库还是静态库在后⾯就是版本号。都去掉就是
c标准库
⼀般在Linux环境下
.so:动态库 (居多)
.a :静态库 默认是没有安装的
在Windows中
XXXX.dll:动态库
YYYY.lib :静态库
- 动态库(动态链接)是C/C++或者其他第三⽅提供的所有⽅法的集合,被所有程序以链接的⽅式,关联起来!
库中的所有的函数,都有⼊⼝地址,所谓的动态链接,其实就是要把连接库中的函数地址拷⻉到我们 的可执⾏程序的特定位置!
- 静态库(静态链接) 是C/C++或者其他第三⽅提供的所有⽅法的集合,被所有程序以拷⻉的⽅式,将需 要的代码,拷⻉到⾃⼰的可执⾏程序中!
动态链接:
优点:形成的可执⾏程序体积⽐较⼩,⽐较节省资源!
缺点:稍微慢⼀些,强依赖动态库,动态库没了,所有的依赖这个库的程序都⽆法运⾏了。
静态链接:
优点:⽆视库,可以独⽴运⾏
缺点:体积太⼤,浪费资源
默认情况下,云服务器是没有安装C静态库的,只有动态库,如果要安装C静态库:
sudo yum install glib-static
C++的静态库
sudo yum install -y libstdc++-static
可以看⻅静态库链接的⽂件远远⼤于动态库链接的⽂件。
所以下载IDE的时候,默认要做的是:
1、下载开发环境include,lib
2、设置合理的查找路径
3、规定好我们形成可执⾏程序的链接⽅式!