sudo给普通用户提权
在root用户下输入
vim /etc/sudoers
添加白名单,名单上的用户可以用root权限运行
gcc和g++编译c和c++文件
g++可以编译c++和c文件
gcc只能编译c文件
./a.out 执行a.out可执行文件
通过g++编译器展示预处理->编译->汇编->链接的文件
预处理:去注释,头文件展开,条件编译,宏替换
以test.c文件为例
gcc -E test.c -o test.i
结果如图所示:
1.stdio.h的头文件展开了
2.max宏被替换了
3.因为默认产生release版本,条件编译打印hello realease
4.注释被消除
条件编译便于实现对功能的裁剪,比如vip和普通用户之间功能裁剪可以通过条件编译实现。
gcc -S test.c -o test.s
对文件进行编译处理生成汇编代码
输入指令,将汇编指令变成机器码
gcc -c test.c/test.i/test.s -o test.o
vim打开
用二进制编辑器 od指令打开
gcc指令含义:-o 相当于命名生成的文件
gcc test.c -o test 默认是生成a.out可执行文件,此时生成的可执行文件 test(linux文件类型和后缀无关)
-E/-S/-c :从某个文件开始执行生成编译文件(test.i),链接文件(test.s),目标文件(test.o)
如gcc -S test.i -o test.s,从编译文件开始生成链接文件。如果换成test.c,变成从源文件开始生成链接文件。
ESc:对于esc键,文件后缀iso和ios有点像o放在最后
链接
test.o不能单独执行要通过链接头文件和库文件。头文件提高方法声明,库文件提供方法的实现如printf,scanf等,(库文件相当于源文件打包,还可以达到隐藏文件的目的。)
Linux包含动态库 xxx.so(静态库) 和 xxx.a(动态库),windows包含.dll(动态库) .lib(静态库)
只要是编译型语言安装开发环境时都会下载头文件和库文件,如vs安装时就会安装C标准文件。
链接一般有两种方式,动态链接和静态链接。
动态链接,可执行文件共用同一个库文件,编译器会告诉可执行文件库文件的路径,在程序运行时
去动态库提取。
静态链接,库文件会拷贝一份给目标文件,可执行文件有库文件的代码。
usr/include 的头文件
库文件放在usr/lib64下
ldd查看可执行程序依赖的动态库
Linux centos默认是动态链接,用 -static选项可以进行静态链接
file指令查看是动态还是静态链接。
关于动静态库:
默认动态库优先,-static的本质的改变优先级。
如果没有静态库,不能使用-static 指令。
如果没有动态库,只有静态库,一样可以链接。
在真实的链接场景中,往往动静态混合。-static把混合变成全静态。
动静态的优缺点:
动态库相当于共享,能节省空间,一旦缺失会导致无法运行。
静态库不依赖库,能独立运行,占据空间大(拷贝了库的代码)
debug和release版本:
gcc默认形成release版本,debug会比release添加debug信息,所以有了可追踪可调试的特性,但是也会导致debug版本内存占据大。
-g选项相成debug版本
查看debug信息
程序是由二进制01,构成,0,1代码有自己的格式ELF,其中可以读取debug信息也存在ELF中