c - GCC 生成文件不接受 -std=c99 -lm

标签 c gcc makefile ansi

我的 makefile 与 gcc 编译器有问题。如果我直接使用 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

哪里会出错?提前致谢。

最佳答案

对于以下三个规则,您忘记了目标上的 .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 重构为这样可以更容易地发现错误 :)

关于c - GCC 生成文件不接受 -std=c99 -lm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976302/

相关文章:

c++ - 是否有 GCC pragma 来覆盖某些代码段的调试信息 (-g) 的生成?

c++ - 如何在制定目标后设置变量?

c++ - 在带有变量包含参数的 makefile 中添加 Windows 路径

c - MPI:锁定标准输出——一次 1 个进程?

c - 如何创建一个库,其中链接器仅链接我的程序使用的函数?

c - 如何在编译时定义由来自不同模块的静态(私有(private))结构组成的结构数组?

c++ - -DNDEBUG 通常来自哪里?

c - C 中 5 秒后停止 fgets

c++ - C 风格的转换可以处理,但 C++ 转换不能

c - 如何关闭 gcc 编译器优化以启用缓冲区溢出