C++ 如何修改此Makefile以分别构建c和cxx文件?

C++ 如何修改此Makefile以分别构建c和cxx文件?,c++,gcc,makefile,gnu-make,C++,Gcc,Makefile,Gnu Make,下面的Makefile对于C项目非常有效,但是当我们遇到一个包含.cpp文件的目录时,我们发现第一个模式规则用于.cpp文件。我尝试了3到4次改变以获得想要的效果,但我似乎找不到办法。我想知道是否有可能对下面的规则进行任何细微的修改,以便使用COMPILE\u CXX\u命令构建.cpp文件 C_EXT ?= c CXX_EXT ?= cpp OBJ_EXT ?= o C_SRCS := \ src/RT_Socket.c \ s

下面的Makefile对于C项目非常有效,但是当我们遇到一个包含
.cpp
文件的目录时,我们发现第一个模式规则用于
.cpp
文件。我尝试了3到4次改变以获得想要的效果,但我似乎找不到办法。我想知道是否有可能对下面的规则进行任何细微的修改,以便使用
COMPILE\u CXX\u命令构建
.cpp
文件

C_EXT             ?= c
CXX_EXT           ?= cpp
OBJ_EXT           ?= o

C_SRCS := \
src/RT_Socket.c \
src/products.c

CXX_SRCS := \
src/BurnedInAddress.cpp \
src/DiskID.cpp \


C_OBJ_FILES       += $(C_SRCS:.$(C_EXT)=.$(OBJ_EXT))
CXX_OBJ_FILES     += $(CXX_SRCS:.$(CXX_EXT)=.$(OBJ_EXT))


$(ARCHIVE_FILENAME) :   $(C_OBJ_FILES) $(CXX_OBJ_FILES)
    $(CREATE_ARCHIVE_COMMAND)

$(LIBRARY_FILENAME) :   $(ARCHIVE_FILENAME)
    $(CREATE_LIBRARY_COMMAND)

%.$(OBJ_EXT)        :   $(C_SRCS)
    $(COMPILE_C_COMMAND)

%.$(OBJ_EXT)        :   $(CXX_SRCS)
    $(COMPILE_CXX_COMMAND)
编辑: 我想补充一点,我试着用
OBJ
文件列表替换模式目标,结果成功了

$(C_OBJ_FILES)      :   $(C_SRCS)
    $(COMPILE_C_COMMAND)

$(CXX_OBJ_FILES)    :   $(CXX_SRCS)
    $(COMPILE_CXX_COMMAND)
然而,这带来了一个新问题。我们必须使用一些不同版本的Make,当没有
.cpp
文件时,其中一个版本会出现以下错误:

依赖项行上没有目标。停下来

它引用此行:
$(CXX\U OBJ\U文件):$(CXX\U SRCS)

Gnu make似乎对这种情况没有问题,而我们的另一个(OPUS make)。有人能想出解决办法吗?

您可以使用:

CC=gcc
CFLAGS=-O2-壁
CXX=g++
CXXFLAGS=-std=c++11-O3-墙
OBJS=cobj1.o cobj2.o cppobj1.o
.c.o.:
$(CC)$(CFLAGS)-c$<-o$@
.cpp.o:
$(CXX)$(CXXFLAGS)-c$<-o$@
已添加

CXX_OBJ_EXT           ?= obj
取代

CXX_OBJ_FILES         += $(CXX_SRCS:.$(CXX_EXT)=.$(OBJ_EXT))
CXX_OBJ_FILES         += $(CXX_SRCS:.$(CXX_EXT)=.$(CXX_OBJ_EXT))
取代

%.$(OBJ_EXT)          :   $(CXX_SRCS)
%.$(CXX_OBJ_EXT)      :   $(CXX_SRCS)

我个人建议使用cmake而不是make。它会为您处理这样的细节。感谢您的推荐,这里没有选项。创建像
%.$(OBJ\u EXT):$(C\u SRCS)
这样的规则是不正确的。这告诉make每个单独的对象文件都有每个源文件作为先决条件。这意味着,如果更改任何一个源文件,将重建每个对象文件。这不是你想要的。我同意,我可能会在将来找时间制定一个更精确的规则。我不喜欢事情出了问题但仍然有效的时候。目前,这是因为所有源文件在每次构建之前都会复制到一个新目录中(因为它是由CI构建的),所以Make的“更改检测”机制是不相关的。遗憾的是,我认为更精确/正确的Makefile会更复杂。主要是因为我们需要规则来处理生成的$(C_src),并包含来自任意多个子目录的文件:path1/file1.C path2/file2.C。如果你有一个优雅的建议,那就太好了!我对这种方法非常乐观,后缀规则似乎确实在GNU make上获得了预期的效果,但我在OPUS make中遇到了一个错误:>不知道如何生成'src/Action.o'。别说了,我以为你有两个不同版本的GNU make。这种语法可能是特定于GNU的。是的,似乎是这样。仍然在寻找一种替代的make语法来解决这个问题。实际上,似乎在OPUS make中应该支持这种语法,我将重新讨论错误:无法使其工作。相反,我使用了C++文件中对象文件的不同扩展,从而消除了目标之间的歧义。
%.$(OBJ_EXT)          :   $(CXX_SRCS)
%.$(CXX_OBJ_EXT)      :   $(CXX_SRCS)