gpt4 book ai didi

c++ - 混合 C/C++ 源的 Makefile

转载 作者:行者123 更新时间:2023-11-28 04:47:03 25 4
gpt4 key购买 nike

假设我有以下设置

CPPSRC+=path1/foo.cpp
CPPSRC+=path2/main.cpp

CSRC+=path3/zoo.c
CSRC+=path4/bar.c

我想将所有目标文件 .o 生成到 build/ 文件夹中(因此我想同时需要 pathsubst 和模式匹配)。

我还需要用 g++ 和相关的 CXXFLAGS 编译 .cpp,而 .c需要使用 gcc 和更简单的 CFLAGS 进行编译。

我已经走了这么远:

CPPOBJ := $(CPPSRC:%.cpp=%.o)
COBJ := $(CSRC:%.c=%.o)
OBJ := $(COBJ) $(CPPOBJ)
BUILTOBJ := $(addprefix $(BUILD_PATH)/,$(notdir $(OBJ)))

$(APP): $(OBJ)
[...]

$(CPPOBJ): %.o: %.cpp
@echo "[g++" $(BUILD_PATH)$(notdir $@)"]"
$(SILENT)$(GPP) $(CXXFLAGS) $(INCLUDES) -c $< -o $(BUILD_PATH)$(notdir $@)

$(COBJ): %.o: %.c
@echo "[gcc " $(BUILD_PATH)$(notdir $@)"]"
$(SILENT)$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $(BUILD_PATH)$(notdir $@)

但无法达到 $(COBJ): %.o: %.c 先决条件(简而言之,.c 源代码不会被编译)。

怎么做?

最佳答案

您试图使用 gmake 的模式规则实现的目标是不可能的,因为当您从目标文件中剥离源子目录时,您将丢失路径信息。所以像 %.o: %.cpp 这样的通用模式规则永远不会知道要编译 build/foo.o 它需要查看 path1/foo.cpp。更不用说命名冲突的可能性增加了。

可以通过重新创建build/下的子目录结构来解决,即将path1/foo.cpp编译为build/path1/foo.o

一旦排序完成,gmake 就足够聪明来解决看似模棱两可的规则,即编译 .c.cpp 文件的混合完全没有问题,就像下面的例子:

APP = app
BUILD_PATH = build
CPPOBJ := $(CPPSRC:%.cpp=%.o)
COBJ := $(CSRC:%.c=%.o)
OBJ := $(COBJ) $(CPPOBJ)
BUILTOBJ := $(addprefix $(BUILD_PATH)/,$(OBJ))

$(APP): $(BUILTOBJ)
$(CXX) $(CPPFLAGS) -o $@ $(BUILTOBJ) $(LDLIBS)

$(BUILD_PATH)/%.o: %.cpp
mkdir -p $(@D)
$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

$(BUILD_PATH)/%.o: %.c
mkdir -p $(@D)
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

关于c++ - 混合 C/C++ 源的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com