Linux2

编译器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` 代表编译选项等,以方便其他人阅读和理解代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值