linux复习5:C prog

编辑

缩排

为了使C源代码更加整洁易读,可以使用一些工具来自动格式化代码,例如cb(C程序美化器)、bcpp(C++美化器)和indent等。

编译

编译并链接C文件

gcc hello.c -o hello

hello.c 编译并链接成可执行文件 hello

指定输出文件名

gcc -o hello hello.c

与上一条命令相同,明确指定了输出文件名为 hello

预处理

gcc -E hello.c -o hello.i

只进行预处理阶段,生成预处理后的文件 hello.i

生成汇编代码

gcc -S hello.i -o hello.s

将预处理后的文件 hello.i 编译成汇编代码文件 hello.s

生成目标文件

gcc -c hello.s -o hello.o

将汇编代码文件 hello.s 汇编成目标文件 hello.o

链接目标文件

gcc hello.o -o hello

将目标文件 hello.o 链接成最终的可执行文件 hello

指定输入文件类型

gcc -xc hello.tom

强制将 hello.tom 作为C语言源文件处理。-xc 选项告诉 gcc 将输入文件视为C语言源文件,即使其扩展名不是 .c

  1. -w

    关闭所有的警告信息。这对于忽略所有警告并专注于错误信息的情况非常有用,但通常不推荐这样做,因为警告往往能帮助发现潜在的问题。

  2. -Wall

    打开许多常见的警告信息,但并不是所有的警告。这是最常用的选项之一,因为它能够捕获大多数常见的编程错误和不良实践。

  3. -Wno-

    可以后面接具体的警告名称来关闭特定的警告。例如,-Wno-unused 会关闭未使用的变量或函数的警告。

  4. -Wall -Wno-unused

    即使开启了 -Wall,也可以通过 -Wno-unused 来关闭未使用的变量或函数的警告。这样可以保持其他警告开启,同时忽略某些特定的警告。

  5. -Wall -Wno-implicit

    关闭隐式函数声明的警告。隐式函数声明是指没有显式声明就调用的函数,默认情况下 GCC 会发出警告,因为这可能导致类型不匹配的问题。

  6. -Wall -Werror

    将所有的警告当作错误处理。这意味着任何警告都会导致编译失败。这对于确保代码质量非常有用,特别是在持续集成环境中,可以强制开发者修复所有警告。

  7. -Wall -Wextra

    -Wall 的基础上增加更多的警告信息。-Wextra 会启用一些额外的警告,比如未初始化的变量等,这些警告在 -Wall 中是默认关闭的。

库文件

库文件是包含预编译代码的文件,这些代码可以被多个程序重复使用。库文件通常分为静态库和动态库两大类。

  1. 静态库

    • 静态库在编译阶段会被链接到目标代码中,成为可执行文件的一部分。这意味着每次创建可执行文件时,静态库中的代码都会被复制一份到最终的二进制文件中。
    • 静态库的扩展名通常是 .a(在Unix/Linux系统)或 .lib(在Windows系统)。
  2. 动态库

    • 动态库(也称为共享库)在程序运行时才被加载到内存中。多个使用相同动态库的程序可以共享内存中的同一份副本,这有助于节省系统资源。
    • 在Unix/Linux系统中,动态库的扩展名通常是 .so;而在Windows系统中,则是 .dll。

调试

编译源代码

复制代码
gcc -g string-debug.c -o a.out
  • -g 选项告诉 gcc 为生成的可执行文件添加调试信息。

  • -o a.out 指定输出文件名为 a.out

  1. 启动 GDB 并加载可执行文件

    gdb a.out

这会启动 GDB 并加载 a.out 可执行文件。

  1. 装入被调试的可执行文件

    file a.out

虽然你在启动 GDB 时已经指定了 a.out,但这个命令可以确保当前调试的是正确的文件。

  1. 列出源代码

    list

这会显示当前文件的前 10 行源代码。你可以使用 list n 来显示从第 n 行开始的代码。

  1. 运行程序

    run

这会启动程序并运行直到遇到断点或异常。

  1. 查看调用栈

    where

这会显示当前的调用栈,帮助你了解程序的执行路径。

  1. 打印变量值

    print string

这会显示 string 变量的当前值。

  1. 设置断点

    break string-debug.c:7

这会在 string-debug.c 文件的第 7 行设置一个断点。

  1. 再次运行程序

    run

这会重新启动程序,并在设置的断点处暂停。

  1. 修改变量值

    set variable string=(char*)malloc(100)

这会将 string 变量的值设置为通过 malloc 分配的 100 字节的内存地址。

  1. 单步执行

    next

这会执行下一行代码,但不会进入函数内部。如果你希望进入函数内部,可以使用 step 命令。

相关推荐
曹牧1 分钟前
JSON 数组的正确使用方式
java·服务器·前端
石头猫灯6 分钟前
DNS 服务器配置实验
运维·服务器
认真的薛薛20 分钟前
Docker网络模式
linux·运维·数据库·面试·github
民乐团扒谱机34 分钟前
【读论文】Frequency Comb Based Optical Time Transfer基于光频梳的光时间传递
运维·服务器
UP_Continue35 分钟前
Linux--日志的模拟实现
linux·运维·服务器
xlp666hub37 分钟前
深度剖析Linux Input子系统(1):宏观架构与核心原理
linux
东北甜妹1 小时前
playbook
linux·服务器·网络
YMWM_1 小时前
docker在jetson thor的应用
运维·docker·容器·jetson thor
我爱学习好爱好爱1 小时前
Ansible 入门:ad-hoc 临时命令与常用模块
linux·服务器·ansible
s09071361 小时前
【Zynq 进阶一】深度解析 PetaLinux 存储布局:NAND Flash 分区与 DDR 内存分配全攻略
linux·fpga开发·设备树·zynq·nand flash启动·flash分区