我正在尝试编译具有以下结构的项目
项目:
我在编写Makefile进行编译时遇到了困难。我目前有如下命令:
Src1 = $(wildcard $(SRCDIR1)/*.cxx)
Obj1 = $(patsubst $(SRCDIR1)/%.cxx, $(OBJDIR)/%.o, $(Src1))
但是我很难为目标文件制作编译规则a)因为我不能再做了:
$(Obj1): %.cxx
$(CXX) $(CFLAGS) -c $(@:.o=.cxx) -o $@
因为'$ @'命令现在包含构建目录的路径和b)因为先决条件现在包括构建路径,我应该有一个源路径。我已经阅读了大量的make手册试图找到解决方案,但没有运气。 对解决方案的任何帮助表示赞赏 千斤顶
答案 0 :(得分:0)
从个人经验来看,在玩了一些“原始”Makefile后,我真的建议你使用一些工具来构建Makefile,比如automake或cmake。
您仍然需要手动指定所有源文件 - 但至少我更喜欢手动摆弄Makefile。
答案 1 :(得分:0)
我更喜欢的一个选项是在构建目录中构建一个同构目录结构。也就是说,源文件${src_dir}/project_x/main.cxx
构建为${build_dir}/project_x/main.o
。这样,当不同源目录中存在具有相同名称的源文件时,可以防止名称冲突。编译器规则类似于:
${obj_dir}/%.o : ${src_dir}/%.cxx # % includes directory name, e.g. project_x/main
@-mkdir -p ${@D}
${CXX} -c -o $@ ${CPPFLAGS} ${CXXFLAGS} $<
注意在上面它如何动态创建目标目录。这有点过于简单,在实际构建系统中,目标文件依赖(使用order-only dependency)在其目录中,以便make
自动创建目标目录(如果它不存在)而不是推测性地尝试为每个目标对象文件创建它们,即使它已经存在。