文章目录
- 修改sudo用户名单
- gcc与g++指令
- gcc用法
- g++用法
- 程序翻译的过程
- 函数库
- 动态库与静态库
- 什么是动静态库?
- 动静态库的优缺点
- ldd指令
这里补充一个前面遗漏的知识:
修改sudo用户名单
- 必须使用root超级用户进行修改,普通用户是不能访问修改。
- 输入指令打开相应的文件
# vim /etc/sudoers
-
root 用户:
-
在的对应位置修改,只需要将root那一行复制,然后粘贴在下面,将用户名修改成对应的即可。
-
其中,注意,退出的时候需要强制退出。切换成底行模式,输入wq!即可。
gcc与g++指令
g++与gcc的安装指令:
# yum install gcc
# yum install g++
其中,gcc与g++用法一样
gcc用法
注意:gcc只能编译C语言
用法一:执行后会默认在该目录下形成一个 a.out 的文件
# gcc + 文件名
用法二:不想要默认的文件名,可以加选项 -o ,-o后面+生成指定文件
两种写法都可以:
# gcc -o 文件名M .c文件 //编译该.c文件,生成一个名为M的可执行文件
# gcc .c文件 -o 文件名M //编译该.c文件,生成一个名为M的可执行文件
g++用法
注意:g++既可以编译C++,也可以编译C语言
用法一:执行后会默认在该目录下形成一个 a.out 的文件
# g++ + 文件名
用法二:不想要默认的文件名,可以加选项 -o ,-o后面+生成指定文件
两种写法都可以:
# g++ -o 文件名M .c文件 //编译该.c文件,生成一个名为M的可执行文件
# g++ .c文件 -o 文件名M //编译该.c文件,生成一个名为M的可执行文件
程序翻译的过程
扩展知识:语言的发展:二进制语言----->汇编语言----->C语言----->C++,java,shell等语言
问题:
先有语言还是先有该语言对应的编译器呢?先有汇编语言呢还是先有用汇编语言写的编译器呢?
假设现在有汇编语言,那么肯定是先有用二进制语言所写的能够编译汇编语言的编译器,该编译器能够把汇编语言翻译成二进制,才有的汇编语言。同样,第一个把c语言编译器,肯定是利用汇编语言所写能够让C语言变为汇编语言的编译器。这是语言和编译器的自举的过程。
程序翻译的过程,就是从其他语言翻译为计算机能够识别二进制语言的过程,和上面的语言发展方向相反。
以C语言为例:
一.预处理
主要工作:
a,头文件的展开:将头文件部分内容拷贝到源文件,有对应的拷贝条件
b,宏替换
c,去注释
d,条件编译
条件编译的用途:实现代码裁剪等等。
…
注意:经过了预处理,语言种类没有改变,例如:C语言预处理后,还是C语言
翻译时,预处理完成后停止:
方法一:
会将结果打印到显示屏上
# gcc -E 目标文件
//-E::翻译的时候,在预处理完成后就停止
方法二:
将执行后的结果形成一个临时文件
# gcc -E 目标文件 -o XXX.i 文件
二.编译(生成汇编)
主要的工作:
把其他语言 转为 汇编语言(如图)
翻译时,编译完成后停止:
方法:
将执行后的结果形成一个临时文件
# gcc -S 目标文件/预处理后生成的.i文件 -o XXX.s 文件
三.汇编(生成机器可识别代码)
主要工作:
汇编---->二进制(可重定位目标二进制文件) 注意:该文件是不能够执行的。
把其他语言 转为 汇编语言
翻译时,汇编完成后停止:
方法一:
# gcc -c 目标文件 //不指定,编译器会默认生成一个同名.o文件
//-c::翻译的时候,在汇编完成后就停止
方法二:指定文件
# gcc -c 目标文件 -o XXX.o的文件
四.链接(生成可执行文件或库文件)
主要工作:
将我们的可执行程序,与系统中的库建立联系。
例如:
我们所写的程序中,使用了库里面函数,并没有自己实现,这时就需要和库里面的函数建立联系;
命令:
# gcc -o code test.o //不需要带选项,直接生成可执行程序code(可以自己命名)
函数库
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
动态库与静态库
库分为动态库与静态库,在linux中,动态库文件以.so结尾, 静态库以.a结尾。在windows中,动态库文件以.dll结尾, 静态库以.lib结尾。
库本质就是一个文件,里面包含了很多已经被编译好的代码。
什么是动静态库?
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。
动静态库的优缺点
动态库(链接方式:动态链接)
优点:比较节省资源,不会出现太多的重复代码 资源:磁盘,内存,网络等资源(例如:写了一个项目,里面有多个文件,这里文件中调用了很多个库里面的函数,虽然调用了很多函数,但是实现就只有一个,不会造成代码冗余的问题)
缺点:对库的依赖性强,一旦库出现问题,那么所有使用了该库的程序全部都无法运行。
静态库(链接方式:静态链接)
优点:不依赖库(因为静态链接是拷贝),可以在同类型平台中都直接运行。
缺点:体积比较大,比较浪费资源,会出现太多的重复代码 资源:磁盘,内存,网络等资源。
例子:
动态链接(编译器默认)
当我们改为静态链接时:
静态库的查看指令:
# ls /lib64/libc.a
C/C++静态库的安装:命令
# sudo yum install glibc-static libstdc++-static
Linux系统支持开发,因为提前在系统中安装了语言的标准头文件与库文件。
例如:
在Linux中,/libc.so.6为C语言标准库。
ldd指令
功能:可以查看一个可执行程序所依赖的库文件
用法:
# ldd 文件
示例: