0

我有 c 和 c++ 源文件的混合器。我正在尝试将它们组合到目标目录所需的 .o 中。

SOURCES: = SOURCES=src/test.c src/cpptest.cpp src/directfb_test.cpp src/foo.c

我尝试了什么:

OBJECTS=$(SOURCES:src/%.c=$(OBJDIR)/%.o)
OBJECTS+=$(SOURCES:src/%.cpp=$(OBJDIR)/%.o)

这也是

OBJECTS := $(patsubst %.cpp, %.o, $(addprefix $(OBJDIR)/, $(notdir $(SOURCES))))
OBJECTS += $(patsubst %.c, %.o, $(addprefix $(OBJDIR)/, $(notdir $(SOURCES))))

两者似乎都不起作用。

我在 OBJECTS 中同时获得了 .o 以及 .c 和 .cpps 。有没有办法在 patsubst 中添加 OR?

解决方案:

   OBJECTS := $(patsubst %.cpp, %.o,$(addprefix $(OBJDIR)/,$(filter %.cpp  ,$(notdir $(SOURCES)) )) )
   OBJECTS += $(patsubst %.c, %.o,$(addprefix $(OBJDIR)/,$(filter %.c ,$(notdir $(SOURCES)) )) )

为 %.c 和 %.cpp 添加了过滤器。我想会有其他方法。我要这样做。

4

2 回答 2

2

另一种方法是:

OBJECTS := $(patsubst src/%.cpp, $(OBJDIR)/%.o,$(SOURCES))
OBJECTS := $(patsubst src/%.c, $(OBJDIR)/%.o, $(OBJECTS))

如果您想知道问题中的第一个方法有什么问题,只需放在$(info $(OBJECTS))两个命令之间,就会很清楚。

于 2013-10-21T11:21:20.417 回答
1

处理速度最快且最容易理解的可能是

OBJECTS := $(patsubst %c, $(OBJDIR)/%o, $(patsubst %pp, %, $(notdir $(SOURCES))))
于 2013-10-21T11:13:30.237 回答