linux下写一个makefile,要求把同一级子目录下两个文件夹的.c和.cpp都编译,其中一个文件夹里面全是.c,另外一个文件夹里面全是.cpp,头文件.h也在这两个文件夹中
时间: 2024-02-22 19:55:38 浏览: 127
好的,以下是一个符合你要求的Makefile示例:
```
CC = gcc
CXX = g++
CFLAGS = -Wall -O2
CXXFLAGS = -Wall -O2
TARGET = myprogram
SRCDIRS = ./
C_SRCDIR = cfiles
CPP_SRCDIR = cppfiles
C_SOURCES = $(wildcard $(SRCDIRS)/$(C_SRCDIR)/*.c)
CPP_SOURCES = $(wildcard $(SRCDIRS)/$(CPP_SRCDIR)/*.cpp)
OBJECTS = $(C_SOURCES:.c=.o) $(CPP_SOURCES:.cpp=.o)
$(TARGET): $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $(OBJECTS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(OBJECTS) $(TARGET)
```
你可以将此代码保存为名为`Makefile`的文件,放在你的项目根目录下。其中,`SRCDIRS`指定了源文件所在的目录,`C_SRCDIR`和`CPP_SRCDIR`分别指定了存放`.c`文件和`.cpp`文件的目录名。其他部分的意义可以参考Makefile的语法。
相关问题
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`命令来清理目标文件和可执行文件。
在makefile中如何在编译.o之后搜索目录下所有.o文件
在Makefile中,如果你想要在编译一个特定的`.o`文件之后,自动查找并链接当前目录及其子目录下的所有`.o`文件,你可以使用通配符和`$(wildcard)`函数。假设你的源文件分布在`src/`子目录下,你可以创建一个规则类似这样的:
```makefile
OBJS = $(wildcard src/*.o)
all: my_program
my_program: $(OBJS)
$(CC) -o $@ $^ # 这里$^会包含所有找到的.o文件
%.o: %.cpp
$(CXX) -c $< -o $@
clean:
rm -f *.o my_program
```
在这个例子中:
- `$(wildcard src/*.o)` 使用通配符匹配`src`目录下的所有`.o`文件,并将它们赋值给`OBJS`变量。
- `my_program: $(OBJS)` 规则说明当你需要构建`my_program`时,需要所有的`.o`文件。
- `%.o: %.cpp` 定义了一个依赖规则,当`.cpp`文件改变时,对应的`.o`文件会被重新编译。
当你运行`make all`时,它会自动处理所有相关的`.o`文件。如果想添加一个`clean`目标来清理所有生成的中间文件,可以参照上述`clean`部分。
阅读全文