c++ - MinGW下使用makefile编译所有CPP文件

标签 c++ makefile mingw gnu-make

我的C++项目的目录结构是

/..
   makefile     <- the makefile is in root
   /include     <- subdirectory that has to be included while compiling
   /obj         <- target place for all *.o and final executable
   /src         <- sources

我当前的 makefile 是:

CC=g++
CFLAGS=-c -Wall -std=c++11

INC=-Iinclude
SRC=src
TGT=obj

all: myapp

myapp: myapp.o
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp

myapp.o:
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o

clean:
    rm -rf $(TGT)
    mkdir $(TGT)

这适用于我的第一个文件。我是一个完全的 makefile 新手 - 请帮我编译 /src 目录下的所有文件,并将它们链接到 /obj 目录中的可执行文件。

makefile 必须在 Windows 下工作,我使用的是 MinGW 和 MSYS

最佳答案

添加源文件列表:

SOURCES = $(wildcard $(SRC)/*.cpp)

和相应目标文件的列表:

OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))

和目标可执行文件:

$(TGT)/myapp: $(OBJS)
    $(CXX) $(LDFLAGS) $(OBJS) -o $@

构建对象的规则:

$(TGT)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

现在您必须指定 g++ 的选项:

INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)

一切都在一起:

SRC=src
TGT=obj
INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
SOURCES = $(wildcard $(SRC)/*.cpp)
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))

$(TGT)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(TGT)/myapp: $(OBJS)
    $(CXX) $(LDFLAGS) $(OBJS) -o $@

重要的是,在 $(CXX) ... 前面必须有一个“制表符”,而不是空格。

关于c++ - MinGW下使用makefile编译所有CPP文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109718/

相关文章:

C++ friend 类无效使用不完整类型 OOP

c++ - 为什么在此代码中隐式转换为常量迭代器会失败?

makefile - 如何让automake不那么难看?

c - mcheck.h 在 Windows 中缺失,但在 Linux 中不存在

c++ - 带有 SOIL 的 OpenGL 纹理

c++ - 如何反转字符串中单词(不是字母)的顺序?

c++ - 编译源代码时出现 cURLcpp 错误

makefile - 在 makefile 中从 g++ 切换到 clang++

numpy - 在 Windows 上使用 f2py 构建 64 位 Python 扩展

c++ - SDL 忽略我的主文件