因此,我尝试从几周前重新编译我的一个项目,令我惊讶的是,我不断收到一个错误。我使用MinGW最初是使用Eclipse CDT对其进行编译的。我在GCC上启用了-Wall标志,因此我假设如果代码有问题,我将比抛出make错误1更有用。因此,我怀疑问题可能出在我格式化Make文件的方式上。幸运的是,我上次推送提交时确实编译了项目,而二进制文件仍在存储库中。不过,我将不胜感激,以便我可以继续改进
该项目。
编辑:当我做-all时,它只是拒绝编译。
这是makefile。我希望这很简单,因为我遵循一些错误的语法:
CC=gcc -I../Include -L..\Lib
override CFLAGS+=-Wall -O3 #$(shell pkg-config --cflags fftw3)
#override LDFLAGS+=#$(shell pkg-config --libs fftw3 glib-2.0) -lm
.PHONY: all clean
all: lvdoenc lvdodec
lvdoenc: lvdoenc.o lvdomain.o
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -I../Include -L../Lib -lfftw3
lvdodec: lvdodec.o lvdomain.o
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -I../Include -L../Lib -lfftw3
%.o: %.c
$(CC) -c $(CFLAGS) -o $@ $^
lvdoenc.c: lvdocommon.h
lvdodec.c: lvdocommon.h
clean:
rm -f lvdoenc lvdodec lvdomain.o lvdoenc.o lvdodec.o
这是我的仓库的链接:
https://github.com/Skylion007/LVDOWin
更新:使用一些答案,我已经确认是GCC退出并出现错误1,我无法弄清原因。
Update2:它不向syserr打印任何内容。
最佳答案
如果没有make的输出记录,则在运行它时,我看不到为什么GCC应该静默失败,但是我可以看到makefile至少存在两个问题:
由于您声明正在使用MinGW,因此您的目标平台必须是MS-Windows,在该平台上,可执行文件应使用.exe
扩展名进行限定。因此,您的all: lvdoenc lvdodec
规则格式错误;它至少应为all: lvdoenc.exe lvdodec.exe
[1],(或更佳,对于可移植性all: lvdoenc$(EXEEXT) lvdodec$(EXEEXT)
,在Windows中为EXEEXT = .exe
定义EXEEXT
,而对于以下平台,请不要定义lvdoenc.c: lvdocommon.h
或不定义为空):不需要扩展名)。
您的两个规则lvdodec.c: lvdocommon.h
和.c
显然是不正确的。 .h
文件不依赖于.o
,但是它们各自的lvdoenc.o: lvdocommon.h
文件却取决于。因此,这两个规则应分别为lvdodec.o: lvdocommon.h
和lvdoenc.exe
。
[1]当然,然后,您还需要在整个Makefile中始终正确地分别引用这两个“目标”,分别称为lvdodec.exe
和lvdoenc$(EXEEXT)
(或lvdodec$(EXEEXT)
和CC
)。
我认为makefile中还有一些其他构造值得怀疑:-I../Include
不应真正用-L..\Lib
或/
进行定义(以及为什么前一个\
不一致,而/
>在后者中?两者都应为-I ...
)。按照惯例,CPPFLAGS
属于-L ...
,而LDFLAGS
属于CFLAGS
,并且CPPFLAGS
和CFLAGS
都传递给编译器,并且通常所有CPPFLAGS
,LDFLAGS
和-I ...
传递给编译器驱动程序时,调用链接器时,(尽管正如其他人在注释中指出的那样,.c
设置在将.o
编译为-L ...
时是严格必需的,而设置仅在链接阶段)。