我正在使用以下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文件?
答案 0 :(得分:0)
您需要在此行中指定完整路径:
SOURCES = $(通配符src / lcthw / .c src / .c)
OTW这会成为你可以从哪里运行make命令的约束。可能发生的事情是,由于您所在的目录$(CURDIR)
,通配符未被扩展,因此很难看到这些路径。
您应该尝试从makefile中打印这些变量:
$(info source=$(SOURCES))
如果您的.obj文件放置在与源不同的位置,那么您需要通过在$(OBJECTS)中包含该位置来解释它。