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 $@