基于一些SO问题——以及发现的一些进一步的参考——,我正在尝试构建一个能够:
- 查找,给定目录
$(SRC)
, the .cpp
待编译的文件;
- 编译
.cpp
,生产.o
物体;
- 产生
.so
每个共享对象.o
以前编译的。
为了实现这一点,make 文件应该做的是:
- 查找,给定目录
$(SRC)
, the .cpp
待编译的文件;
- 为每个构建依赖项列表
.cpp
using -MM
编译器标志;
- 使用注释/添加每个依赖项
$(eval ...)
;
- 评估/解决找到的每个依赖关系,产生
.o
and .so
files.
到目前为止我有什么:
除了让它发挥作用之外,我已经能够完成所有事情(:
我收到的错误表明,不知何故,有一个空标签''
作为依赖:
$ 使使:*没有制定目标的规则', needed by
/home/rubens/bin/label.o'。停止。
所以,这是我还无法运行的 makefile:
# Directories
SRC := process init
BIN := $(HOME)/bin
LIB := watershed
LIBPATH := $(WATERSHED)/lib
INC := $(WATERSHED)/include $(XERCES)/include
# Paths
MPICPP := mpic++
SOURCES := $(shell find $(SRC) -name '*.cpp')
OBJECTS := $(addprefix $(BIN)/, $(notdir $(SOURCES:.cpp=.o)))
SHARED := $(OBJECTS:.o=.so)
# Flags
CFLAGS := -std=c++0x -O2 -Wall -fPIC
CFLAGS += $(foreach inc, $(INC), -I $(inc))
LFLAGS :=
LFLAGS += $(foreach lib, $(LIB), -l $(lib))
LFLAGS += $(foreach path, $(LIBPATH), -L $(lib))
# Rules
$(SHARED): | bindir
%.o:
@echo $@ -- [$<][$^][$*]
@echo $(MPICPP) $(CFLAGS) -c $< -o $@
%.so: %.o
@echo $(MPICPP) $(LFLAGS) -shared $< -o $@
bindir:
@mkdir -p $(BIN)
# Utilities
.PHONY: all clean
all: $(SHARED)
clean:
@rm -f $(OBJECTS) $(SHARED)
# Dependencies
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
$(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//')
endef
$(foreach src, $(SOURCES), $(eval $(call dependencies, $(src))))
到底错误在哪里:
这似乎是由依赖项生成步骤引起的,因为当我删除任何空行时,将输出通过管道传输到grep
, 如下:
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
$(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//' | \
grep -v ^$)
endef
该错误以某种方式涉及到一个空的依赖项列表;我可以看到列表实际上是空的echo
是有规则的%.o:
-- 唯一不为空的变量是$@
and $*
.
/home/rubens/bin/label.o -- [][][/home/rubens/bin/label]
mpic++ -std=c++0x -O2 -Wall -fPIC -I /home/rubens/libwatershed/include -I /home/rubens/xerces-c-3.1.1/include -c -o /home/rubens/bin /标签.o
mpic++ -l 分水岭 -L -shared /home/rubens/bin/label.o -o /home/rubens/bin/label.so
非常非常欢迎任何有关解决此问题的更好方法的建议;然而,我真的很想在使用类似的东西之前完成这个makefile的编写Cmake
or Scons
.