编译器GCC
gcc main.c -o main
把main.c文件编译成可执行文件 命名为main
更改main.c后需要重新编译
g++ main.cpp -o main
针对c++文件
gcc -g main.c -o main (加-g生成调试信息)
gcc -v main.c -o main (加-v显示编译过程)
gcc file1.c file2.c -o program (可以同时编译多个源文件)
./main 执行编译后的程序
调试器GDB
首先要
sudo yum install -y yum-utils
和 sudo debuginfo-install glibc
安装glibc库的调试信息包
gcc -g example.c -o example 编译成可调式文件(带-g)
gdb ./example 启动GDB
(gdb) break main:5 在main函数第五行设置断点
(gdb) run 运行 如果有输入,可以在run后加上输入参数,也可以在后面输入
程序会在断点处停止
(gdb) next 逐步执行,查看执行结果
(gdb) print a 查看变量值
(gdb) continue 继续执行到下一断点或者结束
make项目工具
sudo yum groupinstall "Development Tools" 首先安装编译器和make工具
然后构建文件结构:
project/
├── include/
│ └── utils.h
├── src/
│ ├── main.c
│ └── utils.c
└── Makefile
include 的utils.h 包含函数的声明
main.c包含主函数定义,utils.c包含其他函数的定义
然后再makefile写规则,来编译链接这些文件
:
CC = gcc
CFLAGS = -Wall -I./include
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
SOURCES = $(wildcard $(SRC_DIR)/*.c)
OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SOURCES))
EXECUTABLE = $(BIN_DIR)/my_program
$(EXECUTABLE): $(OBJECTS)
mkdir -p $(BIN_DIR)
$(CC) $(CFLAGS) $^ -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(OBJ_DIR)/*.o $(EXECUTABLE)
然后,cd到项目根目录,使用make编译和链接程序
最后,bin1目录下可以看到可执行文件:my_program
./bin/my_program 运行
1. `CC = gcc`:这一行定义了一个变量 `CC`,它指向了 C 编译器的路径,这里是 `gcc`。
2. `CFLAGS = -Wall -I./include`:这一行定义了一个变量 `CFLAGS`,它包含了编译时的一些选项。其中,`-Wall` 选项表示启用所有的警告信息,`-I./include` 表示在编译过程中包含 `./include` 目录。
3. `SRC_DIR = src`:这一行定义了一个变量 `SRC_DIR`,它指向了源文件存放的目录,这里是 `src`。
4. `OBJ_DIR = obj`:这一行定义了一个变量 `OBJ_DIR`,它指向了目标文件存放的目录,这里是 `obj`。
5. `BIN_DIR = bin`:这一行定义了一个变量 `BIN_DIR`,它指向了可执行文件存放的目录,这里是 `bin`。
6. `SOURCES = $(wildcard $(SRC_DIR)/*.c)`:这一行使用 `wildcard` 函数来查找指定目录下所有的 `.c` 文件,并将结果赋给 `SOURCES` 变量。例如,如果 `src` 目录下有 `main.c` 和 `utils.c`,那么 `SOURCES` 就会包含 `src/main.c src/utils.c`。
7. `OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SOURCES))`:这一行使用 `patsubst` 函数来将源文件路径替换为目标文件路径,并将结果赋给 `OBJECTS` 变量。例如,如果 `SOURCES` 包含 `src/main.c src/utils.c`,那么 `OBJECTS` 就会包含 `obj/main.o obj/utils.o`。
8. `EXECUTABLE = $(BIN_DIR)/my_program`:这一行定义了一个变量 `EXECUTABLE`,它指向了最终的可执行文件的路径,这里是 `bin/my_program`。
9. `$(EXECUTABLE): $(OBJECTS)`:这一行表示规则,指定了如何生成目标文件 `$(EXECUTABLE)`。它依赖于变量 `OBJECTS` 中定义的所有 `.o` 文件。
10. `mkdir -p $(BIN_DIR)`:这一行用于创建存放可执行文件的目录,如果该目录不存在的话。
11. `$(CC) $(CFLAGS) $^ -o $@`:这一行是生成可执行文件的命令。`$^` 表示所有的依赖文件,即所有的 `.o` 文件;`$@` 表示目标文件,即最终的可执行文件。
12. `$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c`:这一行表示规则,指定了如何生成目标文件 `$(OBJ_DIR)/%.o`。它依赖于对应的源文件 `$(SRC_DIR)/%.c`。
13. `mkdir -p $(OBJ_DIR)`:这一行用于创建存放目标文件的目录,如果该目录不存在的话。
14. `$(CC) $(CFLAGS) -c $< -o $@`:这一行是生成目标文件的命令。`$<` 表示第一个依赖文件,即源文件;`$@` 表示目标文件。
15. `clean:`:这一行定义了一个伪目标,它用于清理编译生成的目标文件和可执行文件。
16. `rm -rf $(OBJ_DIR)/*.o $(EXECUTABLE)`:这一行是清理命令,用于删除所有的目标文件和可执行文件。
对于变量名(如 `CC`、`CFLAGS` 等),它们确实是可修改的,但通常约定俗成地使用一些惯例,如 `CC` 代表编译器、`CFLAGS` 代表编译选项等,以方便其他人阅读和理解代码。