shell - Makefile 在指定目录中找不到输入文件

标签 shell c

我正在使用以下 Makefile:

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 文件?

最佳答案

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

SOURCES=$(通配符 src/lcthw/.c src/.c)

OTW 这成为您可以从哪里运行 make 命令的限制。可能发生的情况是通配符没有展开,因为您所在的目录 $(CURDIR) 使其很难看到这些路径。

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

$(info source=$(SOURCES))

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

关于shell - Makefile 在指定目录中找不到输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44356609/

相关文章:

linux - 如何创建一个可以替代 C shell 参数的别名?

bash - bash 脚本函数中的并发或锁定访问

c - strncpy和代码的效率

c - 在 C 中创建一个元组

bash - shell 终端 session 中环境之间的共同点是什么?

显示系统物理 IP 的 linux 命令

javascript - nodejs child_processes.exec 无法返回 'nohup' 命令

c - 尝试了解在迭代反转链表时列表如何被修改

c - C 的新功能,奇怪的 calloc() 事件

c - gcc -O3 如何使运行速度如此之快?