SRC=$(wildcard *.cpp) OBJ=$(patsubst %.cpp, %.o,$(SRC))
时间: 2023-11-23 16:06:30 浏览: 154
这是一个 Makefile 中的语句,用于定义变量。其中:
- `SRC=$(wildcard *.cpp)` 表示将当前目录下所有的 `.cpp` 文件的文件名保存到 `SRC` 变量中,使用了 `wildcard` 函数。
- `OBJ=$(patsubst %.cpp, %.o,$(SRC))` 表示将 `SRC` 变量中的每个 `.cpp` 文件名替换成对应的 `.o` 文件名,并将结果保存到 `OBJ` 变量中,使用了 `patsubst` 函数。
举个例子,如果当前目录下有 `foo.cpp` 和 `bar.cpp` 两个文件,那么执行完上述语句后,`SRC` 变量的值为 `foo.cpp bar.cpp`,`OBJ` 变量的值为 `foo.o bar.o`。这样在后续的编译过程中,就可以方便地使用这两个变量来指定源文件和目标文件。
相关问题
linux下,写一个makefile编译一个目录下的所有.cpp文件,每个cpp文件都是一个可执行文件,生产这个目录下所有的可执行文件,单个cpp生产单个可执行文件,如,有两个cpp,hello.cpp,good.cpp,编译后生产两个可执行文件hello和good,怎么编写
在Linux环境下,要创建一个Makefile来编译目录下的所有.cpp文件并生成对应的可执行文件,你可以按照以下步骤编写:
```makefile
# Makefile内容
CC = g++ # 使用g++作为编译器
SOURCES = $(wildcard *.cpp) # 获取当前目录下所有cpp文件名
EXECUTABLES = $(patsubst %.cpp,%.o,$(SOURCES)) # 将cpp文件名转换为.o文件名(临时目标)
OBJECTS_DIR = obj # 对象文件存储目录
EXECUTABLE_DIR = bin # 可执行文件存储目录
all: $(EXECUTABLE_DIR)/$(basename $(SOURCES))
# 添加规则来编译cpp文件到.o文件
$(OBJECTS_DIR)/%.o: %.cpp
@mkdir -p $(dir $@)
$(CC) -c $< -o $@
# 添加规则来链接.o文件生成可执行文件
$(EXECUTABLE_DIR)/$(basename $(SOURCES)): $(OBJECTS_DIR)/%.o
@mkdir -p $(dir $@)
$(CC) -o $@ $^
clean:
rm -rf $(OBJECTS_DIR)/*.o $(EXECUTABLE_DIR)/*
.PHONY: clean all
```
在这个Makefile中,`all`目标会编译所有的cpp文件并生成对应的可执行文件,`clean`目标用于清除编译产生的临时文件。只需在命令行运行`make`即可执行编译,如果想清理则输入`make clean`。
linux下写一个makefile,要求把同一级子目录下两个文件夹的.c和.cpp都编译,其中一个文件夹里面全是.c,另外一个文件夹里面全是.cpp,
好的,以下是一个简单的Makefile,可以满足你的需求:
```
# Makefile
# 设置编译器
CC = gcc
CXX = g++
# 设置编译选项
CFLAGS = -Wall
CXXFLAGS = -Wall
# 设置目标文件名
TARGET = myprogram
# 设置源文件路径和目标文件路径
SRCDIR = .
OBJDIR = obj
# 从源文件列表中获取.c文件的列表
CSOURCES = $(wildcard $(SRCDIR)/*/c/*.c)
# 从源文件列表中获取.cpp文件的列表
CXXSOURCES = $(wildcard $(SRCDIR)/*/cpp/*.cpp)
# 将.c文件列表转换为对应的目标文件列表
COBJECTS = $(patsubst $(SRCDIR)/*/c/%.c,$(OBJDIR)/%.o,$(CSOURCES))
# 将.cpp文件列表转换为对应的目标文件列表
CXXOBJECTS = $(patsubst $(SRCDIR)/*/cpp/%.cpp,$(OBJDIR)/%.o,$(CXXSOURCES))
# 编译所有.c文件为对应的目标文件
$(OBJDIR)/%.o: $(SRCDIR)/*/c/%.c
$(CC) $(CFLAGS) -c $< -o $@
# 编译所有.cpp文件为对应的目标文件
$(OBJDIR)/%.o: $(SRCDIR)/*/cpp/%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
# 构建可执行文件
$(TARGET): $(COBJECTS) $(CXXOBJECTS)
$(CXX) $(CXXFLAGS) $^ -o $@
# 清理目标文件和可执行文件
clean:
rm -f $(OBJDIR)/*.o $(TARGET)
```
这个Makefile假设你的项目结构如下:
```
.
├── Makefile
├── obj
│ ├── file1.o
│ ├── file2.o
│ ├── ...
├── subdir1
│ ├── c
│ │ ├── file1.c
│ │ ├── file2.c
│ ├── cpp
│ │ ├── file1.cpp
│ │ ├── file2.cpp
├── subdir2
│ ├── c
│ │ ├── file1.c
│ │ ├── file2.c
│ ├── cpp
│ │ ├── file1.cpp
│ │ ├── file2.cpp
└── ...
```
其中,子目录`subdir1`和`subdir2`中分别包含了`.c`和`.cpp`文件。Makefile会自动查找这些文件,并将它们编译为目标文件,然后链接成可执行文件`myprogram`。你可以通过修改`TARGET`变量来更改可执行文件的名字。你可以通过运行`make clean`命令来清理目标文件和可执行文件。
阅读全文