make [2]:***没有规则来制作'main'所需的目标`-check'。停止

时间:2014-01-29 17:21:00

标签: c makefile

我对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

1 个答案:

答案 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.alibcheck.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");

另见How to print the ld(linker) search path