当我使用 makefile 进行编译时,我收到以下警告:
clang: warning: -lllist: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-L./bin' [-Wunused-command-line-argument]
Run Code Online (Sandbox Code Playgroud)
这可能是因为我弄乱了我的 Makefile(如下)中的某些内容。我没有正确链接库吗?谁能指出我的问题吗?
all: list parser
parser: list parserCal bin/LinkedListAPI.o bin/CalendarParser.o
ar cr bin/libcparser.a bin/LinkedListAPI.o bin/CalendarParser.o
list: listparser bin/LinkedListAPI.o
ar cr bin/libllist.a bin/LinkedListAPI.o
listparser: src/LinkedListAPI.c include/LinkedListAPI.h
gcc -Wall -std=c11 -c -Iinclude src/LinkedListAPI.c -o bin/LinkedListAPI.o
parserCal: src/CalendarParser.c include/LinkedListAPI.h include/CalendarParser.h include/HelperFunctions.h
gcc -Wall -std=c11 -c -L./bin -lllist -Iinclude src/CalendarParser.c -o bin/CalendarParser.o
TEST: list parser main.c
gcc -Wall -std=c11 -Iinclude main.c -o bin/runMe -L./bin -lllist -lcparser
clean:
rm bin/*.o bin/*.a
Run Code Online (Sandbox Code Playgroud)
小智 8
直接的问题在于这条规则:
TEST: list parser main.c
gcc -Wall -std=c11 -c -Iinclude main.c -o bin/runMe -L./bin -lllist -lcparser
Run Code Online (Sandbox Code Playgroud)
该选项-c意味着仅编译,不链接,因此任何与链接器相关的命令行参数都将被忽略,因此您会收到该警告。消除-c它就会起作用。
也就是说,这个 Makefile是“混乱的”。通常,您的目标应该是创建的文件,例如
bin/libllist.a: listparser bin/LinkedListAPI.o
ar cr bin/libllist.a bin/LinkedListAPI.o
Run Code Online (Sandbox Code Playgroud)
按照您的方式,make 并不比 shell 脚本更有用,因为它不知道创建了哪些文件,也无法检查是否需要重建。此外,如果不小心有一个名为list. 如果您有不创建文件的规则,则必须通过将它们作为虚假目标来告诉make ,例如:
.PHONY: all clean
Run Code Online (Sandbox Code Playgroud)