尽管定义了结构,但 Makefile 变量打印为空

问题描述 投票:0回答:2

我正在开发一个 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:

  • Make 正在正确找到所有目录
  • 我确定文件扩展名是正确的
  • 变量没有被覆盖

编辑 2: 我得到的具体错误是: make: *** No rule to make target /test.cpp', needed by ..../test.o

..../test.o 在正确的目录中并单独定义,而不依赖于像 libsrc 这样的 patsubst。

makefile
2个回答
0
投票

仔细阅读:

TESTSRCDIR = $(SRCDIR)/test
    ^^^

和:

TESTSRC = $(TESTSCRCDIR)/test.cpp
                ^^^

0
投票

没有正确设置 $(TESTSRC) 可能有几个原因。这里有一些你可以尝试的事情:

  • 检查 $(TESTSCRCDIR) 是否设置正确:确保 TESTSRCDIR变量设置为正确的目录。如果 $(TESTSCRCDIR) 没有设置正确,那么 $(TESTSRC) 将是 空。

  • 检查 $(wildcard $(TESTSCRCDIR)/test.cpp) 是否找到文件: 您可以通过在
    中运行ls $(TESTSCRCDIR)/test.cpp来测试它 终端。如果文件存在,那么它应该被打印到
    终端。如果文件不存在,则通配符函数将 返回一个空字符串。

  • 检查变量设置是否正确:你可以添加 $(info TESTSRC: $(TESTSRC)) 到你的 Makefile 来打印出变量的值 $(TESTSRC) 制作过程中的变量。这会帮助你
    确定变量设置是否正确。

  • 检查文件扩展名是否正确:确保文件
    测试源文件的扩展名为 .cpp。如果文件扩展名
    不同,通配符功能可能找不到文件。

  • 检查变量没有被覆盖:如果你已经定义 $(TESTSRC) 在你的 Makefile 的其他地方,然后它会覆盖
    您之前设置的值。确保没有其他
    Makefile 中 $(TESTSRC) 的定义。

© www.soinside.com 2019 - 2024. All rights reserved.