-Wunused-command-line-argument 编译时出现错误(C Makefile)?

waf*_*les 4 c gcc makefile

当我使用 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)