我正在尝试清理我的项目一点,我想将目标文件和包含文件放在一个单独的文件夹中,并能够在我不同的测试子目录中编译另一个makefile。我想这样做,以便测试目录中的make文件不必知道上面目录中的对象:我一直在努力寻找make和编译。
不确定我做错了什么,但除了这个问题,我会感谢任何信息,以理清我对make
和g++
的看法,所以将来我知道在哪里看
无论如何,我对项目布局有两个问题:
项目
inc/
-- header files
-obj/
--object files
-source
-make file for project that compiles objects in obj directory (makefile0)
-testing/
--test1/
---test.cc
---makefile1
问题1
所以我想将头文件包含在test.cc的inc目录中,然后专注于编译test.cc,就像我将包含标准库头文件一样。现在我需要在makefile1中引用../../obj/中的对象,并且想要忽略它。并做一些简单的事情,如
g++ -I ../../inc/ -c test.cc
怎么可能这样做?
问题2
在makefile0中,对于每个源文件,我必须将$(OBJ)或$(INC)附加到我在这些文件夹中的任何文件的前面,并想知道是否有任何方法要清理我的make文件做一些事情喜欢
Spinless2DFieldIndex.o: Spinless2DFieldIndex.cc Utils.o Dispersion.h
而不是
$(ODIR)/Spinless2DFieldIndex.o: Spinless2DFieldIndex.cc $(ODIR)/Utils.o $(INC)/Dispersion.h
答案 0 :(得分:3)
以下内容应该有效:
项目/生成文件
objdir := obj/
vpath %.cc source
vpath %.o $(objdir)
CPPFLAGS := -Iinc -MMD -MP
.PHONY: all
all: testing/test1/test
include source/Makefile
include testing/test1/Makefile
项目/源极/生成文件
override objects := $(objdir)obj.o
$(objects): $(objdir)%.o: %.cc
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(OUTPUT_OPTION) $<
clean:: ; $(RM) $(objects) $(objects:.o=.d)
-include $(objects:.o=.d)
项目/测试/ TEST1 /生成文件
override dir := $(dir $(lastword $(MAKEFILE_LIST)))
$(dir)test: obj.o
clean:: ; $(RM) $(dir)test $(dir)test.d
-include $(dir)test.d
这应该允许一定程度的模块化,尽管makefile中的不对称性背叛了这样一个事实,即您想要拥有一个单独的obj
目录同时希望在自己的目录中拥有测试可执行文件也许不是组织事物的最佳方式。我个人使用更多configure
样式的makefile来重新创建当前工作目录中的项目树,这有助于将源与构建分开。