一、之前关于 sudo 的问题
在 Linux 中新建的用户使用 sudo(提升权限)不可用,提示不在白名单里面。
权限提升一般由 root 操作,普通用户需被加入信任白名单才能使用 sudo。
添加普通用户到白名单里。
二、Linux 编译器 - gcc/g++ 使用
gcc 用于编译 C 语言,g++ 用于编译 C 语言和 C++。
2.1 编译的背景知识
编译过程主要分为四个阶段:
- 预处理:处理以'#'开头的预处理指令,如宏定义、文件包含、条件编译、去注释等。
- 编译:检查代码规范性与语法错误,将代码翻译成汇编语言。
- 汇编:把编译阶段生成的汇编文件转化为目标文件。
- 连接:将目标文件与所需函数库链接,生成可执行文件或库文件。
2.2 gcc 编译过程详解
- 预处理:使用
gcc -E 要编译的文件 -o 目标文件格式,如gcc -E hello.c -o hello.i。"-E" 选项使 gcc 在预处理结束后停止,"-o" 指定目标文件,".i" 文件为预处理后的 C 原始程序。 - 编译:
gcc -S 预处理后的文件 -o 汇编文件,如gcc -S hello.i -o hello.s。"-S" 选项只进行编译不汇编,生成汇编代码。 - 汇编:
gcc -c 汇编文件 -o 目标文件,如gcc -c hello.s -o hello.o。"-c" 选项将汇编代码转化为二进制目标代码。 - 连接:
gcc 目标文件 -o 可执行文件(默认动态链接),如gcc hello.o -o hello。
函数库分为静态库(后缀名 ".a",编译链接时代码全部加入可执行文件,文件大但运行无需库文件)和动态库(后缀名 ".so",编译链接时不加入代码,运行时加载,节省系统开销,gcc 默认使用动态库)。
2.3 gcc 选项解析
- 输出控制:
-o 文件指定输出文件。 - 优化选项:
-O0无优化;-O1为缺省值;-O2、-O3优化级别逐渐升高。 - 调试与警告:
-g生成调试信息供 GNU 调试器使用;-w不生成任何警告信息;-Wall生成所有警告信息。 - 链接控制:
-static采用静态链接;-shared尽量使用动态库,生成文件小但需系统有动态库。 - 编译控制:
-S编译到汇编语言不进行汇编和链接;-c编译到目标代码。 - 预处理相关:
-E只激活预处理,需重定向输出。
2.4 动态库与静态库
动态库与静态库的区别如下:
- 静态库:编译时链接,文件体积较大,发布时无需依赖库文件。
- 动态库:运行时加载,文件体积较小,发布时需确保系统存在对应库文件。
2.5 Debug 与 Release
在软件开发中,Debug(调试)和 Release(发布)是不同的构建配置,使用 gcc/g++ 编译时差异明显。默认是 release 模式。


