所以我试着从几个星期前重新编译我的一个项目,令我惊讶的是我一直收到错误。我使用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打印任何东西。
答案 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.h
和lvdodec.c: lvdocommon.h
显然不正确; .c
文件不依赖于.h
,但它们各自的.o
文件都依赖于lvdoenc.o: lvdocommon.h
。因此,这两个规则应分别为lvdodec.o: lvdocommon.h
和lvdoenc.exe
。
[1]当然,您还需要分别正确地引用这两个“目标”,lvdodec.exe
和lvdoenc$(EXEEXT)
,(或lvdodec$(EXEEXT)
和CC
),始终如一地,整个makefile。
在makefile中还有一些其他构造,我认为这些构造有问题:-I../Include
不应该使用-L..\Lib
或/
来定义{(以及为什么不一致{前者为{1}},后者为\
?两者都应为/
)。通常,-I ...
属于CPPFLAGS
,-L ...
属于LDFLAGS
,CFLAGS
和CPPFLAGS
都传递给编译器,通常调用链接器时,CFLAGS
,CPPFLAGS
和LDFLAGS
的所有都传递给编译器驱动程序(尽管如其他人已经注意到的那样)在评论中,在-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问题。