c++ - 如何修改这个Makefile来分别构建c和cxx文件?

标签 c++ gcc makefile gnu-make

下面的 Makefile 对于 C 项目工作得很好,但是当我们遇到包含 .cpp 文件的目录时,我们发现第一个模式规则正在用于 .cpp 文件。我已经尝试了 3 或 4 个更改来获得所需的效果,但我似乎找不到办法。我想知道是否可以对以下规则进行任何微小的改动,以便使用 COMPILE_CXX_COMMAND 构建 .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 文件时,其中一个版本会失败并出现以下错误:

No targets on dependency line. Stop.

它引用了这一行:$(CXX_OBJ_FILES) : $(CXX_SRCS)

Gnu make 似乎对这种情况没有问题,我们的另一个 (OPUS Make)。谁能想到解决方法?

最佳答案

您可以使用 suffix rules :

CC = gcc
CFLAGS = -O2 -Wall
CXX = g++
CXXFLAGS = -std=c++11 -O3 -Wall

OBJS = cobj1.o cobj2.o cppobj1.o

.c.o:
        $(CC) $(CFLAGS) -c $< -o $@

.cpp.o:
        $(CXX) $(CXXFLAGS) -c $< -o $@

关于c++ - 如何修改这个Makefile来分别构建c和cxx文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260675/

相关文章:

c++ - 段错误 : Address out of bounds for a pointer in C

linux - Hello World 程序 Nasm 汇编和 C 的执行指令数不同

android - 如何加快AOSP模块制作的mm

makefile - 构建 XDebug 供 MAMP 使用?

c++ - 在 Windows 上列出 *.lib 中的函数

c++一遍又一遍地检查函数返回

python - pybind11 中的命名默认参数

c++ - 如何在 gcc 中禁用尾调用优化

c - GCC 需要在#define 中使用下划线吗?

无扩展名的 Makefile 模式规则?