编译器

 

LLVM概述——介绍与安装

llvm/clang

安装

windows

在windows下配置Clang编译器

linux

  • 命令安装
sudo apt install llvm clang
  • 源码安装
sudo wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-15.0.7.tar.gz
sudo tar xvf llvm-project-llvmorg-15.0.7

sudo mkdir -p /usr/local/llvm
sudo cmake -S . -B build -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE="Release" -DLLVM_INCLUDE_TESTS=OFF -DCMAKE_INSTALL_PREFIX="/usr/local/llvm"
sudo cmake --build build -j ${nproc}
sudo cmake --install build

使用

基础命令

基本和gcc相同

gcc/g++

编译

-E

仅进行预处理操作

gcc main.c -E -o main.i

-I

添加头文件搜索路径

g++ -I 头文件目录 源文件 -o 可执行文件
  • 示例, 以/path/include搜索头文件
g++ -I /path/include ...

-D

条件编译, 通过-D宏=值指定对应宏值

  • 示例, 仅编译YES宏包含部分
#include <stdio.h>

int main() {
    #if YES
        printf("OK\n");
    #endif
    printf("Hello World\n");
    return 0;
}

-S

将预处理文件生成汇编文件

gcc main.i -S -o main.s

-c

将汇编文件生成目标文件

gcc main.s -c -o main.o

-L

添加库文件搜索路径

g++ -L 库文件路径 源文件 -o 可执行文件
  • 示例, 添加/path/to/lib搜索路径
g++ -L /path/to/lib source.cpp -o executable

-shared

创建动态库

g++ 源文件 -fPIC -shared -o 库文件
  • 示例, 生成main.so
g++ main.c -fPIC -shared -o main.so

-o

直接生成可执行文件

g++ main.c -o main

-static

禁用动态库, 避免依赖问题, 但编译出程序较大

g++ -static main.c -o main

提示

警告

  • -w

忽略所有警告

  • -Werror

不区分警告和错误, 遇到任何警告都停止编译

  • -Wall

对代码所有可能有问题地方发出警告

  • -Wshadow

作用域相关存在变量同名时发出告警

  • -Wextra

对所有合法但值得怀疑表达式发出告警

调试

gdb 程序

run

运行程序遇到断点后停止运行, 等待输入下一步命令

continue

继续执行到下一个断点处(或运行结束)

next

单步跟踪程序, 遇到函数调用时, 直接调用, 不进入函数

step

单步调试, 遇到有函数调用, 进入函数运行

until

运行程序直到退出循环体

  • until+行号

运行至某行, 不仅仅用来跳出循环

finish

运行程序, 直到当前函数完成返回, 并打印函数返回时堆栈地址和返回值及参数值等信息

call 函数(参数)

调用程序中可见函数, 并传递参数, 如: call gdb_test(55)

quit

退出gdb

break

在第n行处设置断点

break func

在函数func()入口处设置断点

delete n

删除第n个断点

disable n

暂停第n个断点

enable n

开启第n个断点

clear n

清除第n行断点

info breakpoints

显示当前程序断点设置情况

delete breakpoints

清除所有断点

list

列出程序源代码, 默认每次显示10行

  • list 行号

将显示当前文件以”行号”为中心前后10行代码, 如: list 12

  • list 函数名

将显示函数源代码

  • list : 不带参数

将接着上一次 list 命令输出下边内容

print

print 表达式

表达式可以是任何当前正在被测试程序的有效表达式, 如当前正在调试C语言程序, 那么”表达式”可以是任何C语言有效表达式, 包括数字, 变量甚至是函数调用

  • print 数字a

将显示数字a值

  • print ++a

a 值加1显示

  • print name

显示字符串name值

  • print gdb_test(22)

将以整数22作为参数调用 gdb_test() 函数

  • print gdb_test(a)

将以变量 a 作为参数调用 gdb_test() 函数

display

在单步运行时将非常有用, 使用display命令设置一个表达式后, 它将在每次单步进行指令后, 紧接着输出被设置的表达式及值. 如: display a

watch

设置监视点, 一旦被监视表达式值改变, gdb将强行终止正在被调试程序. 如: watch a

whatis

查询变量或函数

info function

查询函数