这是我第一次尝试编写makefile,因此有很大的改进空间。我需要使用包sedumi和intel编译器工作室在mac上为matlab生成几个mex函数。
这是makefile
<v-avatar/>
实际上,Makefile工作得很好。 make然后make all返回matlab中所需的mex函数。
我有OBJ0到OBJ37,虽然添加线条解决了问题我想知道是否有更简单的方法来实现相同的结果。
非常感谢。
版
PS。感谢https://github.com/jtilly/mex的作者对makefile的部分内容。
答案 0 :(得分:0)
您可以改进几个方面:
使用make自动变量(float dist(Points p)
{
return std::sqrt(p.x*p.x+p.y*p.y);
}
,$@
,$<
...)
$^
这比shell循环有几个优点。最重要的一点是只有一个C文件更改时只运行一个编译。使用您的解决方案,只需更改一个C文件即可重新编译。此外,SRC := $(wildcard *.c)
OBJ := $(patsubst %.c,%.o,$(SRC))
%.o: %.c
$(CC) $(CCFLAGS) -I$(MDIR)/extern/include -c -Ic++ $< -o $@
是一个扩展到现有目标文件的通配符。通常不是你想要的。请注意,在您的情况下,您还可以使用static pattern rule:
*.o
看起来几乎相同但将规则限制在指定的目标列表$(OBJ): %.o: %.c
$(CC) $(CCFLAGS) -I$(MDIR)/extern/include -c -Ic++ $< -o $@
。
使用宏和foreach-eval-call
来实例化链接器规则:
$(OBJ)
请注意.PHONY: all clean
EXTS :=
# $(1): variable name
define MY_rule
$(1)_EXT := $$(patsubst %.o,%.$$(EXT),$$(firstword $$($(1))))
EXTS += $$($(1)_EXT)
$$($(1)_EXT): $$($(1))
$$(CC) $$(CCFLAGS) $$(CINCLUDE) $$^ -o $$@
endef
OBJVARS := OBJ0 OBJ1 ... OBJ37
OBJ0 := bwblkslv.o sdmauxFill.o sdmauxRdot.o
OBJ1 := choltmpsiz.o
$(foreach v,$(OBJVARS),$(eval $(call MY_rule,$(v))))
all: $(EXTS)
clean:
rm -f $(OBJ) $(EXTS)
以转义由$$
添加的第一个扩展。例如,eval
的第一次迭代实例化以下规则:
foreach
设计宏的一种简单方法包括首先编写您想要的内容,例如OBJ1_EXT := $(patsubst %.o,%.$(EXT),$(firstword $(OBJ1))
EXTS += $(OBJ1_EXT)
$(OBJ1_EXT): $(OBJ1)
$(CC) $(CCFLAGS) $(CINCLUDE) $^ -o $@
变量,将每个OBJ1
替换为$
,最后替换$$
} OBJ1
。