【问题标题】:GCC makefile doesn't accept -std=c99 -lmGCC makefile 不接受 -std=c99 -lm
【发布时间】:2013-11-27 09:12:28
【问题描述】:

我在使用 gcc 编译器的 makefile 时遇到问题。如果我直接使用 gcc 作为:

gcc -std=c99 -lm tm.c tm_coins.c tm_options.c tm_stock.c tm_utility.c -o tm -Wall -pedantic

一切正常。我需要 -std-c99 和 -lm。

但是,我被告知要使用 makefile。这是我的制作文件:

CFLAGS=-ansi -Wall -pedantic
LFLAGS=-std=c99 -lm 
CC=gcc
all:tm
tm:tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o
    $(CC) $(LFLAGS) tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o -o tm $(CFLAGS)

tm.o: tm.h tm.c
    $(CC) $(LFLAGS) $(CFLAGS) -c tm.c

tm_coins.o:tm_coins.h tm_coins.c
    $(CC) $(LFLAGS) $(CFLAGS) -c tm_coins.c

tm_options:tm_options.h tm_options.c
    $(CC) $(LFLAGS) $(CFLAGS) -c tm_options.c

tm_stock:tm_stock.h tm_stock.c
    $(CC) $(LFLAGS) $(CFLAGS) -c tm_stock.c

tm_utility:tm_utility.h tm_utility.c
    $(CC) $(LFLAGS) $(CFLAGS) -c tm_utility.c

使用上面的 makefile 我得到以下错误。我的理解是 -std=c99 和 -lm 不起作用。 (看看下面的第一行。-std=c99 和 -lm 不存在)

gcc -ansi -Wall -pedantic   -c -o tm_options.o tm_options.c
tm_options.c: In function ‘purchase_ticket’:
tm_options.c:37: error: expected expression before ‘/’ token
tm_options.c:52: error: expected expression before ‘/’ token
tm_options.c:102: warning: ISO C90 forbids mixed declarations and code
tm_options.c: In function ‘display_tickets’:
tm_options.c:239: error: expected expression before ‘/’ token
tm_options.c: In function ‘add_ticket’:
tm_options.c:285: error: expected expression before ‘/’ token
tm_options.c:303: error: expected expression before ‘/’ token
tm_options.c:314: warning: ISO C90 forbids mixed declarations and code
tm_options.c: In function ‘delete_ticket’:
tm_options.c:387: error: expected expression before ‘/’ token
tm_options.c:405: error: expected expression before ‘/’ token
tm_options.c: In function ‘display_coins’:
tm_options.c:461: error: expected expression before ‘/’ token
tm_options.c: In function ‘restock_tickets’:
tm_options.c:501: error: expected expression before ‘/’ token
tm_options.c: In function ‘restock_coins’:
tm_options.c:526: error: expected expression before ‘/’ token
tm_options.c: In function ‘save_data’:
tm_options.c:555: warning: ISO C90 forbids mixed declarations and code

错误在哪里?提前致谢。

【问题讨论】:

    标签: c gcc makefile ansi


    【解决方案1】:

    对于以下三个规则,您忘记了目标上的.o 后缀:

    tm_options:tm_options.h tm_options.c
        $(CC) $(LFLAGS) $(CFLAGS) -c tm_options.c
    
    tm_stock:tm_stock.h tm_stock.c
        $(CC) $(LFLAGS) $(CFLAGS) -c tm_stock.c
    
    tm_utility:tm_utility.h tm_utility.c
        $(CC) $(LFLAGS) $(CFLAGS) -c tm_utility.c
    

    这就是为什么您编写的规则不适用的原因。相反,它回退到将.c 源编译成.o 的默认规则。

    你的意思是包含它,像这样:

    tm_options.o:tm_options.h tm_options.c
        $(CC) $(LFLAGS) $(CFLAGS) -c tm_options.c
    
    tm_stock.o:tm_stock.h tm_stock.c
        $(CC) $(LFLAGS) $(CFLAGS) -c tm_stock.c
    
    tm_utility.o:tm_utility.h tm_utility.c
        $(CC) $(LFLAGS) $(CFLAGS) -c tm_utility.c
    

    我建议重构你的makefile,这样你就有一个将.c编译成.o的通用规则:

    %.o: %.c
        $(CC) $(CFLAGS) -o %@ -c %<
    

    然后,您只需要指定文件的依赖项:

    tm_options.o: tm_options.h tm_options.c
    tm_stock.o: tm_stock.h tm_stock.c
    tm_utility.o: tm_utility.h tm_utility.c
    

    并且上述规则会自动应用。将您的 makefile 重构为此将更容易发现错误:)

    【讨论】:

    • 谢谢马格努斯。你对 .o 扩展名是正确的。它解决了一半的问题。保罗解决了另一半。我不知道如何拆分答案标记:)
    • 呵呵 :) 也许这次添加答案标记会产生误导 :P 我很高兴你得到了帮助 :)
    【解决方案2】:

    无论如何你都不希望在编译命令中出现LFLAGS - 将-std=c99 放入CFLAGS - makefile 应该更像这样:

    CFLAGS = -ansi -Wall -pedantic -std=c99
    LFLAGS = -lm 
    CC = gcc
    
    all: tm
    
    tm: tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o
        $(CC) $(LFLAGS) tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o -o tm
    
    tm.o: tm.h tm.c
        $(CC) $(CFLAGS) -c tm.c
    
    tm_coins.o: tm_coins.h tm_coins.c
        $(CC) $(CFLAGS) -c tm_coins.c
    
    tm_options.o: tm_options.h tm_options.c
        $(CC) $(CFLAGS) -c tm_options.c
    
    tm_stock.o: tm_stock.h tm_stock.c
        $(CC) $(CFLAGS) -c tm_stock.c
    
    tm_utility.o: tm_utility.h tm_utility.c
        $(CC) $(CFLAGS) -c tm_utility.c
    

    (我还添加了 Magnus 指出的缺失的 .o 后缀。)

    【讨论】:

    • 谢谢保罗。你帮助了另一半并完成了解决方案。非常感谢。
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2011-01-12
    • 2021-05-17
    • 2015-11-29
    • 2011-04-21
    相关资源
    最近更新 更多