【发布时间】:2013-12-12 11:20:16
【问题描述】:
我的 c++ 项目有以下设置:
在 src 文件夹中,有 *.cpp 和对应的 *.h 文件和 在 obj 文件夹中,我想拥有我的 .o 文件。
到目前为止,编译和链接都不是问题。但是现在我有太多的 .cpp 和 .h 文件无法手动将它们放入 Makefile 中。所以我决定在makefile中写这个小指令:
collect_sources:
@echo "collecting source files";
@echo "SRCS = \\" > sources;
@for file in ./src/*.cpp; \
do \
echo "$$file \\" >> sources; \
done
我也是
-include sources
在makefile的开头
生成的文件sources 看起来不错,尽管最后一行有一个我不喜欢的反斜杠。但是,afaik 它也应该是有害的。
我现在还需要自动建立依赖关系。在我在 Makefile 中直接将 *.cpp 文件定义为 SRCS 的上一个版本中,以下代码很好:
$(SRCDIR)/%.cpp:
@$(CXX) $(DEPFLAGS) -MT \
"$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \
$(addprefix ,$$file) >> $(DEP);
clear_dependencies:
echo "" > $(DEP);
depend: clear_dependencies $(SRCS)
但是包含sources-文件,它永远不会到达上面的代码块。
以下是 Makefile 顶部定义的常量:
CXX = g++
CXXFLAGS = -Wall \
-Wextra \
-Wuninitialized \
-Wmissing-declarations \
-pedantic \
-O3 \
-p -g -pg
LDFLAGS = -p -g -pg
DEPFLAGS = -MM
SRCDIR = ./src
OBJDIR = ./obj
TARGET = ./bin/my_funky_function_which_is_not_the_real_name
-include sources
OBJSTMP = $(SRCS:.cpp=.o)
OBJS = $(OBJSTMP:$(SRCDIR)=$(OBJDIR))
DEP = depend.main
EXT_SRC = .cpp
EXT_OBJ = .o
我错过了什么?我的方法有效/可行吗?
【问题讨论】:
-
附注:请不要推荐任何已经可以做到这一点的工具。我真的很想了解这一点并完全控制正在发生的事情。
-
有一个简单的错误和很多可能的改进。你想走多远?
-
一步一步达到绝对最优;-)