我的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
Run Code Online (Sandbox Code Playgroud)
我也这样做
-include sources
Run Code Online (Sandbox Code Playgroud)
在makefile的开头
生成的文件sources看起来很好,尽管在最后一行中有一个我不喜欢的反斜杠.但是afaik也应该是有害的.
我现在还需要自动构建依赖项.在我上一个版本中,我SRCS直接在Makefile中定义了*.cpp文件,以下代码很好:
$(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)
Run Code Online (Sandbox Code Playgroud)
但是包含sources-file,它永远不会到达上面的代码块.
以下是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
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我的方法有效/可行吗?
好的,你问了.
1:你collect_sources:... include sources是光荣的Rube Goldberg的hackery.这样做:
SRCS = $(wildcard ./src/*.cpp)
Run Code Online (Sandbox Code Playgroud)
如果你想通过眼睛确认,你可以这样做:
$(info $(SRCS))
Run Code Online (Sandbox Code Playgroud)
2:
clear_dependencies:
echo "" > $(DEP);
Run Code Online (Sandbox Code Playgroud)
只是为了美学,让我们解决这个问题.
clear_dependencies:
$(RM) $(DEP);
Run Code Online (Sandbox Code Playgroud)
3:
$(SRCDIR)/%.cpp:
@$(CXX) $(DEPFLAGS) -MT \
"$(subst $(SRCDIR),$(OBJDIR),$(subst $(EXT_SRC),$(EXT_OBJ),$$file))" \
$(addprefix ,$$file) >> $(DEP);
Run Code Online (Sandbox Code Playgroud)
这需要一些工作.首先是当前问题:目标是存在的真实文件,规则没有先决条件.因此规则将不会运行(我不知道为什么它在以前的版本中对你有用,也许其他东西是不同的).作为临时修复,我建议我们切换到静态模式规则和PHONY目标:
.PHONY:$(SRCS)
$(SRCS) : $(SRCDIR)/%.cpp:
@$(CXX) $(DEPFLAGS) -MT \
...
Run Code Online (Sandbox Code Playgroud)
看看是否一切正常,那么我们就可以解决这些问题.
| 归档时间: |
|
| 查看次数: |
2824 次 |
| 最近记录: |