Linux 开发:sudo、gcc/g++ 与构建解析
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟
🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩
在 Linux 系统的使用过程中,权限管理与代码编译是两项重要的操作。本文将详细介绍新建用户使用 sudo 权限的问题以及 gcc/g++ 编译器的使用方法。
目录
一、之前关于sudo的问题🧐
二、Linux 编译器 - gcc/g++ 使用 ⚙️
2.1 编译的背景知识
2.2 gcc 编译过程详解
2.3 gcc 选项解析
2.4 动态库与静态库
2.5 Debug 与 Release🛠️
一、之前关于sudo的问题🧐
在Linux中新建的用户 sudo(提升权限)用不了,如下👇:
权限提升一般由root操作,但是这里是zhangsan(普通用户)操作不在白名单里面,不能用sudo
如果想使用,得让root将其放入信任白名单里面。
添加普通用户到白名单里
二、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 选项解析
- 预处理相关:“-E” 只激活预处理,需重定向输出➡️。
- 编译控制:“-S” 编译到汇编语言不进行汇编和链接;“-c” 编译到目标代码📏。
- 输出控制:“-o 文件” 指定输出文件📄。
- 链接控制:“-static” 采用静态链接;“-shared” 尽量使用动态库,生成文件小但需系统有动态库🔗。
- 优化选项:“-O0” 无优化;“-O1” 为缺省值;“-O2”、“-O3” 优化级别逐渐升高🌟。
- 调试与警告:“-g” 生成调试信息供 GNU 调试器使用;“-w” 不生成任何警告信息;“-Wall” 生成所有警告信息⚠️。
2.4 动态库与静态库
动态库与静态库的区别👇
2.5 Debug 与 Release🛠️
在软件开发中,Debug(调试)和 Release(发布)是不同的构建配置,使用 gcc/g++ 编译时差异明显。默认是release模式
Debug 构建🐛:用于开发阶段,旨在辅助开发者查错。编译时常用 “-g” 选项生成调试信息,方便调试器定位源码行。同时,一般不做过多优化,避免改变代码执行顺序或结构增加调试难度。如 “gcc -g -Wall -O0 hello.c -o hello_debug”,生成含丰富调试信息的可执行文件,便于开发中发现解决问题。
Release 构建🚀:用于面向用户的发布版本,更注重性能与资源占用。编译时通常采用较高优化级别,如 “-O2” 或 “-O3” 提升执行效率,且不生成调试信息以减小文件大小。例如 “gcc -O3 -Wall hello.c -o hello_release”,其运行效率高于 Debug 版本,更适合发布。
了解二者区别并合理运用 gcc/g++ 编译选项,有助于开发者在不同阶段高效开发、发布优质软件,更好地在 Linux 系统开展工作。🌟
如果在学习过程中有任何疑问或建议,欢迎随时交流分享哦😉! 👉【A Charmer】