【问题标题】:-Wunused-command-line-argument error when compiling (C Makefile)?-Wunused-command-line-argument 编译时出错(C Makefile)?
【发布时间】:2017-10-02 06:44:52
【问题描述】:

当我使用我的 makefile 进行编译时,我会收到以下警告:

clang: warning: -lllist: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-L./bin' [-Wunused-command-line-argument]

这可能是因为我在 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

【问题讨论】:

    标签: c gcc makefile


    【解决方案1】:

    直接的问题在于这条规则:

    TEST: list parser main.c
        gcc -Wall -std=c11 -c -Iinclude main.c -o bin/runMe -L./bin -lllist -lcparser
    

    选项-c 表示只编译,不链接,因此任何与链接器相关的命令行参数都将被忽略,因此您会收到该警告。删除-c 即可。

    也就是说,这个 Makefile “搞砸了”。通常,您的目标应该是创建的文件,例如

    bin/libllist.a: listparser bin/LinkedListAPI.o
        ar cr bin/libllist.a bin/LinkedListAPI.o
    

    按照您的方式,make 并不比 shell 脚本有用,因为它不知道创建了哪些文件,也无法检查是否需要重新构建。此外,如果偶然有一个名为list 的文件,它将完全停止工作。如果您有不创建文件的规则,则必须告诉通过将它们作为 phony 目标来处理它,例如:

    .PHONY: all clean
    

    【讨论】:

    • 删除了 -c 标志,但仍然收到相同的警告,我在 makefile 中添加的内容是否超出了我的需要,这就是您的意思吗?仍在尝试找出静态库以及如何链接它们。
    • 确定你删除了它在正确的行(应该链接你的最终可执行文件的那个)?如果是这样,我不相信你......
    • 是的,在 TEST 行我把 -c 去掉了,它仍然有警告。
    • @waffles 好吧,那是不可能的。 'linker' input unused 在没有链接器阶段且没有-c(或类似-S 的标志)时明确显示,链接器阶段。再看看……
    • @waffles 你不应该那样做,它会改变问题的意思。我非常了解您认为所做的事情,但我可以向您保证,警告是因为使用-l 选项调用gcc 时没有链接阶段。肯定有其他问题,您可能有文件的副本或其他什么。
    【解决方案2】:

    makefile 是一系列需要做的事情,但是,如果某个创建的文件在其依赖文件中没有更改,则不会重新创建该文件。

    最好非常具体地说明要运行的特定实用程序。

    应使用 .PSEUDO 运算符标记 make 文件中实际上并未创建同名文件的目标。

    这里是一个正确编写的 makefile 示例,使用发布的 makefile 作为基础:我在 makefile 中包含了一些 cmets 以阐明每个步骤的操作

    请注意(在此 make 文件中)没有将编译参数和规则与链接参数和规则混合

    # use ':=' so the macro will only be evaluated once
    # using just '=' results in the macro being reevaluated each time it is referenced.
    # notice that desirable parameters are being set inside the macro definitions
    
    CFLAGS := -Wall -Wextra -pedantic -std=c11
    
    RM := /bin/rm -f
    
    CC := /bin/gcc
    
    AR := /bin/ar cr
    
    # tell 'make' that these targets do not produce a file of the same name
    .PSEUDO: all clean
    
    # this is the first target in this makefile
    # it lists the three 'final' targets
    # so each of those target rules will be executed
    
    all: bin/runMe bin/libcparser.a bin/libllist.a
    
    
    # link step
    bin/runMe: main.o bin/CalendarParser.o bin/LinkedListAPI.o 
        $(CC)  main.o bin/CalendarParser.o bin/LinkedListAPI.o -o bin/runMe -L./bin -lllist -lcparser
    
    
    # archive creation step
    bin/libcparser.a: bin/LinkedListAPI.o bin/CalendarParser.o
        $(AR)  bin/libcparser.a bin/LinkedListAPI.o bin/CalendarParser.o
    
    
    # archive creation step
    bin/libllist.a: bin/LinkedListAPI.o
        $(AR)  bin/libllist.a bin/LinkedListAPI.o
    
    
    # notice the archive targets and final runnable file
    # reference certain dependencies.
    # when a dependency is not available or not 'up to date'
    # then the associated rule is executed to bring that dependency 'up to date'
    
    # compile ./src/LinkedListAPI.c to create ./bin/LinkedListAPI.o
    bin/LinkedListAPI.o: src/LinkedListAPI.c include/LinkedListAPI.h
        $(CC) $(CFLAGS) -c  src/LinkedListAPI.c -o bin/LinkedListAPI.o -Iinclude
    
    
    # compile ./src/CalendarParser.c to create ./bin/calendarParser.o
    bin/CalendarParser.o: src/CalendarParser.c include/LinkedListAPI.h include/CalendarParser.h include/HelperFunctions.h
        $(CC) $(CFLAGS) -c src/CalendarParser.c -o ./bin/CalendarParser.o -Iinclude 
    
    
    # compile main.c to create main.o
    main : main.c include/LinkedListAPI.h include/CalendarParser.h include/HelperFunctions.h
        $(CC) $(CFLAGS)  -c main.c -o main.o -Iinclude
    
    
    clean:
        $(RM) bin/*.o bin/*.a
    

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 2014-06-02
      • 2014-05-07
      • 2014-11-24
      • 2022-01-09
      • 2014-05-26
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多