Shell Makefile可以';在指定目录中找不到输入文件

Shell Makefile可以';在指定目录中找不到输入文件,shell,c,Shell,C,我正在使用以下生成文件: CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS) LIBS=-ldl $(OPTLIBS) PREFIX?=/usr/local SOURCES=$(wildcard src/lcthw/*.c src/*.c) OBJECTS=$(patsubst %.c,%.o,$(SOURCES)) TEST_SRC=$(wildcard tests/*_tests.c) TESTS=$(pats

我正在使用以下生成文件:

CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LIBS=-ldl $(OPTLIBS)
PREFIX?=/usr/local

SOURCES=$(wildcard src/lcthw/*.c src/*.c)
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))

TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))

TARGET=build/libYOUR_LIBRARY.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))

all: $(TARGET) $(SO_TARGET) tests

dev: CFLAGS=-g -Wall -Isrc -Wall -Wextra $(OPTFLAGS)
dev: all

$(TARGET): CFLAGS += -fPIC
$(TARGET): build $(OBJECTS)
   ar rcs $@ $(OBJECTS)
   ranlib $@

$(SO_TARGET): $(TARGET) $(OBJECTS)
   $(CC) -shared -o $@ $(OBJECTS)

build:
   @mkdir -p build
   @mkdir -p bin

# The Unit Tests
.PHONY: tests
tests: CFLAGS += $(TARGET)
tests: $(TESTS)
   sh ./tests/runtests.sh

valgrind:
   VALGRIND="valgrind --log-file=/tmp/valgrind-%p.log" $(MAKE)

# The Cleaner
clean:
   rm -rf build $(OBJECTS) $(TESTS)
   rm -f tests/tests.log
   find . -name "*.gc*" -exec rm {} \;
   rm -rf `find . -name "*.dSYM" -print`

install: all
   install -d $(DESTDIR)/$(PREFIX)/lib/
   install $(TARGET) $(DESTDIR)/$(PREFIX)/lib/
我在这条线路上遇到了问题:

$(CC)   -shared -o  $@  $(OBJECTS)
我得到一个错误:

cc: fatal error: no input files

当我尝试运行以下任何命令时:make、make all和make dev。为什么我的makefile在我指定的目录中找不到.c文件?

您需要在此行中指定完整路径:

$(CC)   -shared -o  $@  $(OBJECTS)
SOURCES=$(通配符src/lcthw/.c src/.c)

OTW这将成为您可以从何处运行make命令的约束。可能发生的情况是通配符没有被扩展,因为您所在的目录,
$(CURDIR)
,使它很难看到这些路径

您应该尝试从makefile内部打印这些变量,方法是:

$(info source=$(SOURCES))

如果您的.obj文件与源文件位于不同的位置,那么您需要通过将该位置也包括在$(对象)中来说明这一点。

这是您(作为程序员)正在开发的程序,而不是您试图安装的程序(作为系统管理员)?如果是前者,则上一页的人可能更了解编写makefile的细节。如果您想移动问题,请标记它,选择需要版主干预,并要求将其移动到堆栈溢出。或者留下评论说它应该被移动,社区可以这样做。(我不认为你可以把你自己的问题标记为离题,换成离题,但那也行。)另外,检查一下显而易见的:你已经做了一个
src/lcthw/*.c src/*.c
,只是为了确保那里有文件,对吗?这是我正在做的一个程序,谢谢你的建议,我将它移到堆栈溢出