我正在做一个编译器项目,我已经编写了我的lexi.l和parser.y,它在我的朋友计算机上正确工作,但是我得到了以下错误:
Opcal.tab.o:文件不可识别:文件格式不可识别
collect2:错误: ld返回1退出状态
这是我的Makefile
FLEX = /usr/bin/flex
CFLAGS = -g
LDLIBS = -lfl
CC = /usr/bin/gcc
BISON = /usr/bin/bison
pascal: pascal.tab.o pascal.lex.o
$(CC) -o pascal pascal.tab.o pascal.lex.o $(LDLIBS)
pascal.lex.o: pascal.lex.c pascal.tab.h
$(CC) -c pascal.lex.c
pascal.tab.o: pascal.tab.c pascal.tab.h
$(CC) -c pascal.tab.c
pascal.tab.c: pascal.y
$(BISON) -d pascal.y
pascal.lex.c: pascal.l
$(FLEX) pascal.l
mv lex.yy.c pascal.lex.c
clean:
rm pascal.tab.o pascal.lex.o pascal.tab.c pascal.lex.c \
pascal.tab.h pascal 我用的是Ubuntu 14.04
发布于 2015-06-01 15:12:11
你没有说你和你的朋友有什么样的电脑。在这种情况下,它可能是重要的信息,因为它似乎工作在一个,而不是另一个。您也没有说明在获取错误时输入了哪些命令。这可能是至关重要的得到一些帮助也!
然而,pascal.tab.o文件将由编译器(可能是gcc )创建。二进制文件不能在不同的计算机之间移植是很正常的。有时,即使您链接了*.o文件以生成可执行文件,该可执行文件也不会在另一台计算机上工作,因为它与正在使用的软件不兼容。生成此错误的程序ld是合并这些二进制文件的链接器。
我们不能指望在运行Windows的PC上构建的二进制文件可以在Mac或iPhone上使用。我们也不能期望linux编译器构建一个运行在Mac上的二进制文件。但是,构建在不同版本的windows上的二进制文件是不可互换的,来自不同类型linux的二进制文件也同样不可互换。你不会指望iPhone应用程序可以在安卓上工作吧?
您仍然应该能够传输文件lexer.l和parser.y,并通过flex/bison和gcc运行它们,以便再次获得一个工作程序。
(最新情况)
现在我看到您的makefile,我猜您从您的朋友计算机复制了所有的文件,包括makefile。解决办法对你来说很容易:
make clean
make这两个命令应该删除不兼容的二进制文件,并在您的计算机上创建新的二进制文件,您应该做得很好。
https://stackoverflow.com/questions/30574446
复制相似问题