【问题标题】:Makefile to build C and CPP filesMakefile 用于构建 C 和 CPP 文件
【发布时间】:2014-09-29 20:31:12
【问题描述】:

我一直在寻找一个 Makefile 来编译一个包含大量 C 和 C++ 文件的大型项目。我已经使用 Eclipse 成功编译它,但我想去一个独立的 Makefile。 我发现这个通用的 Makefile 非常适合我的项目,除了它只能编译 C 或 C++ 文件,但不能同时编译两者......所以它在链接时失败。

为 CPP 或 C 编译的原始 Makefile 的位:

        SRC_EXT = cpp
        OURCES = $(shell find $(SRC_PATH)/ -name '*.$(SRC_EXT)' -printf '%T@\t%p\n' \
        SOURCES = $(shell find $(SRC_PATH)/ -name '*.$(CPP_EXT)' -o -name '*.$(C_EXT)' -printf '%T@\t%p\n' \
                            | sort -k 1nr | cut -f2-)
        # fallback in case the above fails
        rwildcard = $(foreach d, $(wildcard $1*), $(call rwildcard,$d/,$2) \
                                $(filter $(subst *,%,$2), $d))
        ifeq ($(SOURCES),)
            SOURCES := $(call rwildcard, $(SRC_PATH)/, *.$(SRC_EXT))
        endif
OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o)
DEPS = $(OBJECTS:.o=.d)

我尝试将其修改为:

SRC_EXT = cpp c
SOURCES = $(shell find $(SRC_PATH)/ -name '*.$(CPP_EXT)' -o -name '*.$(C_EXT)' -printf '%T@\t%p\n' \
                    | sort -k 1nr | cut -f2-)
# fallback in case the above fails
rwildcard = $(foreach d, $(wildcard $1*), $(call rwildcard,$d/,$2) \
                        $(filter $(subst *,%,$2), $d))
ifeq ($(SOURCES),)
    SOURCES := $(call rwildcard, $(SRC_PATH)/, *.$(SRC_EXT))
endif

但我不确定如何处理 OBJECTS 指令以使其与多个扩展一起使用:

OBJECTS = $(SOURCES:$(SRC_PATH)/%.$(SRC_EXT)=$(BUILD_PATH)/%.o)

有人可以帮忙吗?

谢谢

【问题讨论】:

    标签: c++ c makefile


    【解决方案1】:

    首先,将.cpp 替换为.o,然后将剩余的.c 替换为.o

    【讨论】:

    • 感谢您的回答。我不确定你的意思。你的意思是我应该先编译 CPP 文件然后编译 C 文件?能详细点吗?
    • 不,我的意思是在 Makefile 中分配 OBJECTS 变量的行中,文件名上的文本替换发生了 - 后缀 SRC_EXT 被后缀“.o”替换。您需要将两个后缀都替换为“.o”。
    • 我明白了。关于我应该如何做的任何建议?使用 && 不会成功,这几乎是我正在编写的第一个复杂的 Makefile。我该如何组合它们?
    • 您可以使用可以嵌套的 patsubst 函数。或者您可以继续使用替换引用,使用临时变量。
    • 但是,再想一想,您可以忽略我的建议,将任何后缀替换为 .o。 basename 和 adduffix 函数可能对此很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多