Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在单个makefile目标中编译C和CPP源代码_C++_C_Makefile_Gnu Make - Fatal编程技术网

C++ 在单个makefile目标中编译C和CPP源代码

C++ 在单个makefile目标中编译C和CPP源代码,c++,c,makefile,gnu-make,C++,C,Makefile,Gnu Make,我有一个makefile,我正在使用C源代码和CPP源代码。下面是makefile中的一段代码。有没有一种方法可以结合以下两个目标来编译这两种文件类型 #definitions OBJ_DIR := obj DEP_DIR := dep CXX := g++ DEBUG := -g -O0 OPT := -std=c++11 -Wextra -Wall -pthread LFLAGS = $(DEBUG) $(OPT) $(INC) CFLAGS = $(LFLAGS) -c #auto-d

我有一个makefile,我正在使用C源代码和CPP源代码。下面是makefile中的一段代码。有没有一种方法可以结合以下两个目标来编译这两种文件类型

#definitions
OBJ_DIR := obj
DEP_DIR := dep

CXX := g++
DEBUG := -g -O0
OPT := -std=c++11 -Wextra -Wall -pthread
LFLAGS = $(DEBUG) $(OPT) $(INC)
CFLAGS = $(LFLAGS) -c

#auto-dependency generation (part 1)
DEP_FLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.Td
POSTCOMPILE = @mv -f $(DEP_DIR)/$*.Td $(DEP_DIR)/$*.d && touch $@

#compile object files from CPP source
$(OBJ_DIR)/%.o: %.cpp $(DEP_DIR)/%.d
    $(CXX) $(CFLAGS) $(DEP_FLAGS) $< -o $@
    $(POSTCOMPILE)

#compile object files from C source
$(OBJ_DIR)/%.o: %.c $(DEP_DIR)/%.d
    $(CXX) $(CFLAGS) $(DEP_FLAGS) $< -o $@
    $(POSTCOMPILE)

#auto-dependency generation (part 2)
$(DEP_DIR)/%.d: ;
.PRECIOUS: $(DEP_DIR)/%.d
include $(wildcard $(DEP_DIR)/*.d)
#定义
OBJ_DIR:=OBJ
DEP_DIR:=DEP
CXX:=g++
调试:=-g-O0
OPT:=-std=c++11-Wextra-Wall-pthread
LFLAGS=$(调试)$(选择)$(INC)
CFLAGS=$(LFLAGS)-c
#自动依赖项生成(第1部分)
DEP_FLAGS=-MT$@-MMD-MP-MF$(DEP_DIR)/$*.Td
POSTCOMPILE=@mv-f$(DEP_DIR)/$*.Td$(DEP_DIR)/$*.d&&touch$@
#从CPP源代码编译对象文件
$(目标目录)/%.o:%.cpp$(副目录)/%.d
$(CXX)$(CFLAGS)$(DEP_标志)$<-o$@
$(邮政编码)
#从C源代码编译对象文件
$(目标目录)/%.o:%.c$(副目录)/%.d
$(CXX)$(CFLAGS)$(DEP_标志)$<-o$@
$(邮政编码)
#自动依赖项生成(第2部分)
美元(副署长)/%d:;
。珍贵:$(副署长)/%.d
包括$(通配符$(DEP_DIR)/*.d)
我曾尝试使用第二次扩展将通配符函数与各种不同的格式一起使用,但没有效果

我正在使用Make4.2。自动依赖项生成代码取自


提前感谢使用正确的变量以及、和功能,可以实现以下功能:

EXT:=c cpp
定义规则=
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.$(1)
$$(编译。$(1))$$<-o$$@
恩德夫
$(foreach ext,$(ext),$(eval$(调用规则,$(ext)))#此处$(ext)前没有空格!!!
make具有隐式变量和规则,尤其是许多
COMPILE.*
规则(您可以通过发出shell命令
make-p | grep'COMPILE.*='
查看它们):

cppfags
用于预处理器标志(
cpp
是GNU GCC工具链中的预处理器可执行文件)<默认情况下,大多数平台上的代码>目标搜索为空


下面是一个完整但极简的Makefile,具有更好的自动依赖生成功能(请注意,将
.d
文件放在与
.o
分开的文件夹中会毫无意义地使Makefile复杂化):

TARGET:=可执行文件
EXT:=c cpp
SRC_DIR:=。
OBJ_DIR:=OBJ
DEP_DIR:=DEP
CPPFLAGS=-MMD-MP-MF$(@:$(OBJ_DIR)/.o=$(DEP_DIR)/.d)
CFLAGS:=-Wall-Wextra-pthread
CXXFLAGS:=-std=c++11$(CFLAGS)
LDFLAGS:=-pthread
来源:=$(foreach ext,$(ext),$(通配符$(SRC_DIR)/*。$(ext)))
对象:=$(源:$(SRC_DIR)/%=$(OBJ_DIR)/%.o)
依赖项:=$(对象:$(对象目录)/%.o=$(对象目录)/%.d)
定义规则=
$(OBJ_DIR)/%.$(1).o:$(SRC_DIR)/%.$(1)|$(OBJ_DIR)$(DEP_DIR)
$$(编译。$(1))$$<-o$$@
恩德夫
.骗子:都是干净的
全部:$(目标)
$(目标):$(对象)
$(CXX)$(LDFLAGS)$^-o$@
$(foreach ext,$(ext),$(eval$(调用规则,$(ext)))
$(行政总监)$(副总监):
mkdir-p$@
-包括美元(视情况而定)
清洁:
$(RM)-r$(目标)$(目标董事)$(副董事)

还请注意,我选择将原始源文件扩展名(
c
cpp
)添加到对象文件名(
.c.o
.cpp.o
)中,以解决可能会遇到具有不同扩展名但名称相同的源文件的情况。

CFLAGS
包含特定于c++的标志,并且通常用于C源代码<代码> CXXFLAGG/<代码>是标准的C++标志变量。您通常也应该使用
$(CC)
作为C编译器。使用显式规则来构建以
.C
.cpp
作为源的对象文件可能不是一个好主意。Make已经有了那些内置的。只需在
CFLAGS
(用于
.c
-文件)和
cxflags
(用于
.cpp
-文件)中指定所需的标志。大多数你定义的变量,你真的不应该。它不能覆盖用户的那些代码——只附加到<代码> cFLAGs<代码>和<代码> CXXFLAGG/<代码>变量,并且根本不定义<代码> CXX/C++ >。C++编译器特定的标志。因此,在当前的
Makefile
中,不应将其用于C源代码(这是
CFLAGS
应该用于的)。这是可能的(使用
定义
评估
等),但最终结果比使用两条规则更混乱。这是几天前讨论过的(阅读评论)。
COMPILE.c   = $(CC)  $(CFLAGS)   $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cpp = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c