挣扎与通用makefile

时间:2018-07-15 22:40:20

标签: 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 ... 

1 个答案:

答案 0 :(得分:3)

此规则:

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

讲述如何从文件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,因为这会替换 all 的所有出现,即使它们出现在单词的中间,这不太可能,但不会你要。我会用:

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

完全不需要OBJS_NAMES