Makefile入门三、生成可执行文件且每个cpp对应一个.o文件

一、了解gcc下生成,o和可执行文件

提高makefile,就不得不熟悉gcc命令
gcc编译的四个步骤,预处理->编译->汇编->链接成可执行文件
汇编就是生成.o文件,gcc下命令为

gcc -c test.s -o test.o #.s为编译出来的文件
gcc test.o -o test

或者直接

gcc -c test.c test.o
gcc test.o -o test

也可以一步生成可执行文件

gcc test.c -o test

但是,如果成百上万个可执行文件,咋办,makefile提供了一个方法

二、%.o:%.c作用

网上称为静态模式规则,我们经常会看到这样的makefile文件

%.o:%.c
	$(CC) $(CFLAGS) $(LIBS) $(INC_DIRS)  -o $@ -c $^

前面提到过,makefile中语言为
目标: 依赖项
这里 %.o:%.c 指 所有的生成目标.o文件依赖与所有的.c文件,
$@为目标
$^为所有的依赖

三、例子

工作作用,将头文件放在include文件夹,cpp文件放在source文件夹,test.cc为可执行文件
工程目录:
.
├── include
│ ├── myString.h
│ └── utils.h
├── Makefile
├── source
│ ├── myString.cpp
│ └── utils.cpp
└── test.cc
现在我们要对test.cc 生成一个可执行文件,然后每一个.cpp和.cc生成对应的.o汇编文件
makefile文件如下

TARGETBIN := topic_test

CFLAGS := $(DEFINE_MACROS)
CXXFLAGS := -std=c++11
#includes

INC_DIRS := -I ./include
#SRC_DIRS := ./test.cc
SRC_DIRS += ./source/myString.cpp
SRC_DIRS += ./source/utils.cpp

#libs
LIBS += -lstdc++
LIBS += -ldl -lpthread

CXX_SOURCES = ./test.cc

# 将OBJS赋值,找CXX_SOURCES 和 SRC_DIRS文件夹中的.cc和.cpp文件,给出对应名字的.o
OBJS := $(patsubst %.cc, %.o, $(CXX_SOURCES))
OBJS += $(patsubst %.cpp, %.o, $(SRC_DIRS))

#tools
CC = g++
	#echo TARGET:$(OBJS)


#compile 生成汇编文件.o

%.o:%.c
	$(CC) $(CFLAGS) $(LIBS) $(INC_DIRS)  -o $@ -c $^

%.o:%.cc
	$(CC) $(CFLAGS) $(CXXFLAGS) $(LIBS) $(INC_DIRS) -o $@ -c $^

%.o:%.cpp
	$(CC) $(CFLAGS) $(INC_DIRS) $(LIBS) -o $@ -c $^


#link 链接汇编文件
$(TARGETBIN): $(OBJS) 
	$(CC) -o $(TARGETBIN) $^ $(INC_DIRS) $(CXXFLAGS) $(LIBS)

#linl

clean:
	$(info $(TARGETBIN))
	$(info $(OBJS))
	rm -rf $(TARGETBIN) $(OBJS)
 



  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
生成一个可执行文件Makefile通常包含以下几个部分: 1. 定义目标(target):目标是指要生成可执行文件的名称。可以使用变量来定义目标名称,例如: ``` TARGET = myprogram ``` 2. 定义依赖(prerequisites):依赖是指生成可执行文件所需要的源代码文件或其他依赖文件。可以使用变量来定义依赖文件列表,例如: ``` SRCS = main.c utils.c ``` 3. 定义编译命令(command):编译命令是指将源代码文件编译成目标文件的命令。可以使用变量来定义编译命令,例如: ``` CC = gcc CFLAGS = -Wall -g $(TARGET): $(SRCS) $(CC) $(CFLAGS) -o $@ $^ ``` 在上面的例子中,`$(TARGET)`表示目标文件,`$(SRCS)`表示依赖文件列表,`$(CC)`表示编译器,`$(CFLAGS)`表示编译选项。`$@`表示目标文件,`$^`表示所有依赖文件。 4. 定义其他规则:除了生成可执行文件的规则外,还可以定义其他规则,例如清理临时文件的规则: ``` clean: rm -f $(TARGET) *.o ``` 在上面的例子中,`clean`是规则名称,`rm -f $(TARGET) *.o`是清理临时文件的命令。 通过编写上述规则,保存为名为`Makefile`的文件,然后在命令行中执行`make`命令,即可生成可执行文件。 #### 引用[.reference_title] - *1* *3* [Makefile简介与使用](https://blog.csdn.net/chongbin007/article/details/123709482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [makefile简单编写-生成可执行文件](https://blog.csdn.net/AJDJ26/article/details/79955989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值