我对make文件了解不多。我是学生,这个代码是给我的,并修改c代码本身。我只掌握make文件的基本知识。
我一直收到这个错误:
make[2]: Entering directory `/home/abdelrahman/Documents/Eclipse/storage/test/a1-partial'
make[2]: Leaving directory `/home/abdelrahman/Documents/Eclipse/storage/test/a1-partial'
cd a1-partial && make -s
expr: syntax error
make[2]: Entering directory `/home/abdelrahman/Documents/Eclipse/storage/test/a1-partial'
make[2]: Leaving directory `/home/abdelrahman/Documents/Eclipse/storage/test/a1-partial'
make[2]: *** No rule to make target `-lcheck', needed by `main'. Stop.
make[1]: *** [builda1-partial] Error 2
make: *** [test] Error 2
make[1]: Leaving directory `/home/abdelrahman/Documents/Eclipse/storage/test'
这是我的make文件:
include ../Makefile.common
# Pick a random port between 5000 and 7000
RANDPORT := $(shell /bin/bash -c "expr \( $$RANDOM \% 2000 \) \+ 5000")
# The default target is to build the test.
build: main
# Build the test.
main: main.c $(SRCDIR)/$(CLIENTLIB) -lcheck -lcrypt
$(CC) $(CFLAGS) -I $(SRCDIR) $^ -o $@
# Run the test.
run: init storage.h main
for conf in `ls *.conf`; do sed -i -e "1,/server_port/s/server_port.*/server_port $(RANDPORT)/" "$$conf"; done
env CK_VERBOSITY=verbose ./main $(RANDPORT)
# Make storage.h available in the current directory.
storage.h:
ln -s $(SRCDIR)/storage.h
# Clean up
clean:
-rm -rf main *.out *.serverout *.log ./storage.h ./$(SERVEREXEC)
.PHONY: run
答案 0 :(得分:3)
快速修复可能是更改行:
main: main.c $(SRCDIR)/$(CLIENTLIB) -lcheck -lcrypt
$(CC) $(CFLAGS) -I $(SRCDIR) $^ -o $@
为:
main: main.c $(SRCDIR)/$(CLIENTLIB)
$(CC) $(CFLAGS) -I $(SRCDIR) $^ -o $@ -lcheck -lcrypt
解释:正如Mad Scientist所指出的那样,GNU make
可以将-lcheck
(等)解释为先决条件,但只有 库libcheck.a
或libcheck.so
是当前makefile中的目标,或者可以在标准位置中找到。否则它只是认为它是一个名为-lcheck
的先决条件,它不知道如何构建。
要获取库文件的标准位置,请在-Wl,--verbose
命令行中添加$(CC)
(在我的系统上):
SEARCH_DIR("/usr/i386-redhat-linux/lib");
SEARCH_DIR("/usr/local/lib");
SEARCH_DIR("/lib");
SEARCH_DIR("/usr/lib");