C++ 在makefile中进行模式匹配时获取错误的文件名

C++ 在makefile中进行模式匹配时获取错误的文件名,c++,makefile,build,C++,Makefile,Build,我的项目的目录结构如下所示: |-build |-src |-lib |-libfile1.hpp |-libfile1.cpp |-libfile2.hpp |-libfile2.cpp |-libfile3.hpp |-Makefile(lib) |-examples |-pingpong |-main.cpp |-ping.cpp |

我的项目的目录结构如下所示:

|-build
|-src
   |-lib
      |-libfile1.hpp
      |-libfile1.cpp
      |-libfile2.hpp
      |-libfile2.cpp
      |-libfile3.hpp 
      |-Makefile(lib)
   |-examples
      |-pingpong
          |-main.cpp
          |-ping.cpp
          |-ping.hpp
          |-Makefile(ping)
我的目标是在examples文件夹中有许多示例,它们都使用libfiles,但彼此独立。因此,我想在每个示例文件夹中使用单独的makefile来链接libfile的对象

为了实现这一目标,以下是makefile(lib):

我如何正确地做我想做的事情?我应该有不同的规则或目标吗?或者是否有一种从变量中获取文件名的正确方法

我希望.o文件在相同的位置结束,但可执行文件保留在examples目录中。

问题在于:

$(LOCOBJECT): $(LOCSOURCE) $(LOCINCLUDE)
    mkdir -p $(dir $@)
    $(CC) -c $< -o $@

这仍然不完善,因为所有本地头文件都是来自本地源的每个对象的先决条件。如果您有一个
paile.cpp
,并且您修改了
ping.hpp
,Make将重建
paile.o
,即使paile.cpp不以任何方式依赖于
ping.hpp
。这不是一个严重的问题,它只是意味着Make将做一些额外的工作,在没有理由的情况下重建东西。如果您想解决这个问题,您可以手动将依赖项写入makefile,或者使用更复杂的方法,如。

谢谢,这是有效的,但是我将$(BLD)/%:替换为$(BLD)/%.o,否则我会得到错误“make:**没有规则使目标为'ping.o.cpp',需要'../../../build/ping.o'。停止。”
TARGET = mainpingpong.out

SRC = ../../actorlib
BLD = ../../../build

LIBSOURCE = $(wildcard $(SRC)/*.cpp)
LIBINCLUDE = $(wildcard $(SRC)/*.hpp)
LIBOBJECT = $(patsubst %,$(BLD)/%, $(notdir $(LIBSOURCE:.cpp=.o)))
LOCSOURCE =  $(wildcard *.cpp)
LOCINCLUDE = $(wildcard *.hpp)
LOCOBJECT = $(patsubst %,$(BLD)/%, $(notdir $(LOCSOURCE:.cpp=.o)))

CC = g++
$(TARGET) : $(LIBOBJECT) $(LOCOBJECT)
    $(CC)-o $@ $^

$(LOCOBJECT): $(LOCSOURCE) $(LOCINCLUDE)
    mkdir -p $(dir $@)
    $(CC) -c $< -o $@

$(LIBOBJECT): $(LIBSOURCE) $(LIBINCLUDE)
    cd $(SRC) && $(MAKE)

.PHONY: clean

clean :
    cd $(SRC) && $(MAKE) clean
mkdir -p ../../../build/
g++ -c main.cpp -o ../../../build/main.o

mkdir -p ../../../build/
g++ -c main.cpp -o ../../../build/ping.o
$(LOCOBJECT): $(LOCSOURCE) $(LOCINCLUDE)
    mkdir -p $(dir $@)
    $(CC) -c $< -o $@
$(LOCOBJECT): $(BLD)/%.o: %.cpp $(LOCINCLUDE)
    mkdir -p $(dir $@)
    $(CC) -c $< -o $@