all: matrices.c calculations.o
gcc -std=c99 matrices.c calculations.o -o -lm PROGRAM2_EXE
lib: matrices.h calculations.c
gcc -c -std=c99 calculations.c -o calculations.o
clean:
rm matrices.o calculations.o PROGRAM2_EXE
这是我的项目制作文件。在我的矩阵和我的计算中。c有多个for循环。它给我的错误是错误:“for”循环初始声明只允许在c99模式下进行,但是我的-std=c99在我的文件中。我的问题是
发布于 2014-05-15 22:19:07
对于calculations.o
,您没有规则。这意味着makefile没有指定如何生成calculations.o
。您只有一个生成all
和lib
的规则。
Gmake有一些默认规则。他们中的一个是指,如果您没有filename.o
的规则,那么它是使用$(CC) $(CPPFLAGS) $(CFLAGS) -c filename.c
编译的。
您的make all
行是:
all: matrices.c calculations.o
当您发出make
或make all
时,gmake首先检查依赖项。matrices.c
已经存在了,所以这很好。但是如果calculations.o
不存在,那么它就决定需要构建calculations.o
。您没有为calculations.o
指定规则,所以使用了隐式规则,其中没有-std=c99
。
注意,您的lib
规则编写得很糟糕。所有规则都应该创建相应名称的文件,或者声明为.PHONY
。似乎您认为,如果make lib
文件不存在,那么make应该以某种方式推断它需要执行calculations.o
,但这不是make的工作方式。
要解决问题,只需将lib:
更改为calculations.o:
即可。而且,修复all
行也是很好的风格。规则并不是all
,而是PROGRAM2_EXE
,所以:
.PHONY: all
all: PROGRAM2_EXE
PROGRAM2_EXE: matrices.c calculations.o
gcc -std=c99 matrices.c calculations.o -o PROGRAM2_EXE -lm
(编辑:正如Chris指出的,-o
开关必须紧跟文件名)
最好有一个规则matrices.o
来编译matrices.c
,然后有一个规则PROGRAM2_EXE: matrices.o calculations.o
将两者连接起来。
发布于 2014-05-15 23:11:28
这一行动:
gcc -std=c99 matrices.c calculations.o -o -lm PROGRAM2_EXE
告诉gcc生产一个名为-lm
的可执行文件,这可能不是你想要的。
由于您没有生成connections.o
的规则,所以make将使用它的默认规则从connections.c
构建它,这很可能类似于(来自gmake):
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
因为您没有在CFGLAGS
或CPPFLAGS
中设置CFGLAGS
或CPPFLAGS
,所以不会使用它。
发布于 2018-06-04 10:58:12
我使用以下CFLAGS:
CFLAGS = -Wall -g -std=c99
这对我很有好处。
https://stackoverflow.com/questions/23688746
复制相似问题