c++ - 与一般的 makefile 作斗争

标签 c++ makefile compilation gnu-make

我最近从 Windows 和 VisualStudio 的黑暗面转向了 Linux,并且正在努力让我的通用 makefile 工作。我知道这可能是一个简单的解决方法,但我一直在阅读相关内容并观看 youtube 视频数小时,但似乎无法发现/解决问题 - 请帮忙!

我的所有代码都在同一个目录中(并且工作正常!),但它变得有点少,所以将其移至 src 目录,所有目标文件都移至构建目录。这样,只有 makefile 和最终的可执行文件位于顶层。我收到一条错误消息:

    make: *** No ruke to make target 'build/main.o', needed by 'testProg'. Stop.  

我的 makefile 在下面。任何帮助将非常感激!提前致谢!

    #Program Name:
    PROG = testProg

    CC = g++
    CPPFLAGS = -c -g -Wall
    LINKER = $(CC) -o

    SRC_DIR = ./src
    BUILD_DIR = ./build

    # All source cpp files
    SRCS = $(shell find $(SRC_DIR) -name *.cpp -or -name *.CPP)

    # Substitute the .cpp for a .o for all entries in the $SRCS list.
    OBJS_NAMES = $(subst .cpp,.o,$(SRCS))
    OBJS = $(subst $(SRC_DIR),$(BUILD_DIR),$(OBJS_NAMES))

    all: $(PROG)

    $(PROG): $(OBJS)
        $(CC) $(OBJS) -o $(PROG)

    # Create object files
    %.o: %.cpp
        $(CC) $(CPPFLAGS) $< -o $@

    clean: 
        rm -f $(PROG) $(OBJS)


    #for debugging
    show: 
        @echo 'Source files: ' $(SRCS)
        @echo 'Object files: ' $(OBJS)

当执行 make show 时,我得到输出:

    Source files: ./src/main.cpp ./src/func1.cpp ...
    Object files: ./build/main.o ./build/func1.o ... 

最佳答案

这条规则:

%.o: %.cpp
        $(CC) $(CPPFLAGS) $< -o $@

告诉 make 如何从文件 XXX.cpp 构建文件 XXX.o。 XXX(与 % 匹配的部分)必须相同

在您的新 makefile 中,您正在尝试构建 build/foo.o,因此只有当 make 可以找到 build/foo.cpp 时,该规则才会匹配编译。因为它不能,所以该规则不匹配,并且 make 不知道如何构建您的 build/foo.o 文件。

如果您希望源文件和目标文件位于不同的目录中,您必须编写规则以便拼写出不相同的部分,如下所示:

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
        $(CC) $(CPPFLAGS) $< -o $@

顺便说一句,我建议您不要使用上面的 subst,因为它会替换所有 出现,即使它们出现在不太可能但不会出现的单词中间也是如此。不是你想要的。我会使用:

OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))

根本不需要OBJS_NAMES

关于c++ - 与一般的 makefile 作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352732/

相关文章:

c++ - 在 Linux 上使用 O_RDWR 进行 open() | O_CREAT |如果文件位于 Win10 PC 的 samba 共享上,则 O_EXCL 原子?

c++ - 未找到相关库的 Makefile

python - Python与Nuitka交叉编译到Windows失败

c - 如何编译基本的 D-Bus/glib 示例?

c# - 在构建之前注入(inject) C# 代码

c++ - 数组初始化给出垃圾值

c++ - 如何在 C++ 中为 PacMan 编写 map

c++ - 这段代码有什么用吗?

gcc - arm-eabi-none 对 LPC2148 的 memset 错误的 undefined reference

c++ - 链接未在 Makefile 中完成