我正在开发一个 C++ 库,我遵循以下结构:
ROOTDIR = ~/path/to/proj
BLDDIR = $(ROOTDIR)/build
INCDIR = $(ROOTDIR)/include
SRCDIR = $(ROOTDIR)/src
LIBSRCDIR = $(SRCDIR)/lib
TESTSRCDIR = $(SRCDIR)/test
OBJDIR = $(ROOTDIR)/obj
LIBOBJDIR = $(OBJDIR)/lib
TESTOBJDIR = $(OBJDIR)/test
LIBDIR = $(ROOTDIR)/lib
BINDIR = $(ROOTDIR)/bin
文件定义是:
MKFILE = $(BLDDIR)/Makefile
HDRFILES = $(wildcard $(INCDIR)/*.hpp)
LIBSRCFILES := $(wildcard $(LIBSRCDIR)/*.cpp)
TESTSRC = $(TESTSCRCDIR)/test.cpp
LIBOBJFILES := $(patsubst $(LIBSRCDIR)/%.cpp, $(LIBOBJDIR)/%.o, $(LIBSRCFILES))
TESTOBJ := $(TESTOBJDIR)/test.o
LIBFILE = $(LIBDIR)/$(NAME)-$(VERSION).a
TESTFILE = $(BINDIR)/test
ZIPFILE = $(ROOTDIR)/$(NAME).$(VERSION).zip
我已经测试并确认一切正常,但由于某种原因,即使 Make 能够设置 $(TESTSRC)
,$(TESTOBJ)
打印为空。我尝试在层次结构中设置变量定义以确保所有内容都在级别中生成,但那个变量仍然是空的。
编辑1:
编辑 2:
我得到的具体错误是:
make: *** No rule to make target /test.cpp', needed by ..../test.o
..../test.o 在正确的目录中并单独定义,而不依赖于像 libsrc 这样的 patsubst。
仔细阅读:
TESTSRCDIR = $(SRCDIR)/test
^^^
和:
TESTSRC = $(TESTSCRCDIR)/test.cpp
^^^
没有正确设置 $(TESTSRC)
可能有几个原因。这里有一些你可以尝试的事情:
检查 $(TESTSCRCDIR) 是否设置正确:确保
TESTSRCDIR
变量设置为正确的目录。如果
$(TESTSCRCDIR)
没有设置正确,那么 $(TESTSRC)
将是
空。
检查 $(wildcard $(TESTSCRCDIR)/test.cpp)
是否找到文件:
您可以通过在
中运行ls $(TESTSCRCDIR)/test.cpp
来测试它
终端。如果文件存在,那么它应该被打印到
终端。如果文件不存在,则通配符函数将
返回一个空字符串。
检查变量设置是否正确:你可以添加 $(info TESTSRC: $(TESTSRC))
到你的 Makefile 来打印出变量的值
$(TESTSRC)
制作过程中的变量。这会帮助你
确定变量设置是否正确。
检查文件扩展名是否正确:确保文件
测试源文件的扩展名为 .cpp
。如果文件扩展名
不同,通配符功能可能找不到文件。
检查变量没有被覆盖:如果你已经定义
$(TESTSRC)
在你的 Makefile 的其他地方,然后它会覆盖
您之前设置的值。确保没有其他
Makefile 中 $(TESTSRC)
的定义。