即使使用-Wall,GCC也会以错误1退出。没解释为什么?

时间:2015-06-13 17:49:05

标签: c eclipse compilation makefile mingw

所以我试着从几个星期前重新编译我的一个项目,令我惊讶的是我一直收到错误。我使用MinGW最初编译它和Eclipse CDT。我在GCC上启用了-Wall标志,所以我假设它是代码问题我会有一个比抛出make错误更有用的信息。因此,我怀疑问题可能在于我如何格式化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打印任何东西。

4 个答案:

答案 0 :(得分:1)

如果没有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.hlvdodec.c: lvdocommon.h显然不正确; .c文件不依赖于.h,但它们各自的.o文件都依赖于lvdoenc.o: lvdocommon.h。因此,这两个规则应分别为lvdodec.o: lvdocommon.hlvdoenc.exe

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

在makefile中还有一些其他构造,我认为这些构造有问题:-I../Include不应该使用-L..\Lib/来定义{(以及为什么不一致{前者为{1}},后者为\?两者都应为/)。通常,-I ...属于CPPFLAGS-L ...属于LDFLAGSCFLAGSCPPFLAGS都传递给编译器,通常调用链接器时,CFLAGSCPPFLAGSLDFLAGS的所有都传递给编译器驱动程序(尽管如其他人已经注意到的那样)在评论中,在-I ....c进行编译时,.o设置是绝对必要的,而-L ...设置仅在链接阶段需要。)

答案 1 :(得分:0)

以下makefile更符合您项目所需的内容。

但是,它不使用:

#$(shell pkg-config --libs fftw3 glib-2.0)

您需要重新添加。

在定义宏时注意':='的用法,因此宏只需要评估一次,而不是每次都被引用。

可能需要为您的系统修改SHELL宏和CC宏的路径。

SHELL := /usr/bin/sh

CC := /usr/bin/gcc

#CFLAGS  := -c -Wall -Wextra -pedantic -std=c99 -O3 #$(shell pkg-config --cflags fftw3)
CFLAGS  := -c -Wall -Wextra -pedantic -std=c99 -O3

# override LDFLAGS+=#$(shell pkg-config --libs fftw3 glib-2.0) -lm
LDFLAGS :=


SRCS := $(wildcard *.c)


ENCOBJS := lvdoenc.o lvdomain.o
DECOBJS := lvdodec.o lvdomain.o

.PHONY: all clean

all: lvdoenc lvdodec

lvdoenc: $(ENCOBJS)
    $(CC) $(LDFLAGS) -o $@  $(ENCOBJS) -L../Lib -lfftw3 -lm

lvdodec: $(DECOBJS)
    $(CC) $(LDFLAGS) -o $@ $(DECOBJS)  -L../Lib -lfftw3 -lm

%.o:%.c  lvdocommon.h
    $(CC) -c $(CFLAGS) -c $< -o $@  -I../Include



clean:
    rm -f lvdoenc lvdodec lvdomain.o lvdoenc.o lvdodec.o

答案 2 :(得分:0)

显然,原因之一就是我卸载了64位版本的MinGW,并试图切换到Minbit的32位版本。不幸的是,有些库不能在32位版本中编译,所以我只使用MinGW-w来解决这个问题。事实证明,由于链接器错误,GCC没有启动,但是这个错误并不成比例,直到我试图从Windows终端运行它才能发现。我仍在解决问题,并在完全解决问题后更新这个答案。

答案 3 :(得分:0)

尝试使用MSys中的make编译我的项目时遇到同样的问题。在我在makefile中为gcc输入和输出文件添加引号后,意外问题已经解决。我不知道它是如何工作的,但希望它会帮助别人。 所以在TS示例中,代码应该如下所示

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

PS:从ubuntu终端构建项目没有问题,所以也许它只是一个msys问题。