因此,我尝试从几周前重新编译我的一个项目,令我惊讶的是,我不断收到一个错误。我使用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.hlvdoenc.exe


[1]当然,然后,您还需要在整个Makefile中始终正确地分别引用这两个“目标”,分别称为lvdodec.exelvdoenc$(EXEEXT)(或lvdodec$(EXEEXT)CC)。

我认为makefile中还有一些其他构造值得怀疑:-I../Include不应真正用-L..\Lib/进行定义(以及为什么前一个\不一致,而/ >在后者中?两者都应为-I ...)。按照惯例,CPPFLAGS属于-L ...,而LDFLAGS属于CFLAGS,并且CPPFLAGSCFLAGS都传递给编译器,并且通常所有CPPFLAGSLDFLAGS-I ...传递给编译器驱动程序时,调用链接器时,(尽管正如其他人在注释中指出的那样,.c设置在将.o编译为-L ...时是严格必需的,而设置仅在链接阶段)。

08-26 07:42