2016-08-13 88 views
0

我是一名Unix/Linux新手,他正在尝试运行一个由没有任何文档并且已经被删除的人编写的shell脚本。此脚本包含行:在Windows中的gcc无法编译为Unix/Linux编写的C程序

./search $opt1 $arg1 < $poly 2>&1 | tee $output 

正试图获取文件$poly和呼叫程序./search和输出转移到$output

当我到了这条线,我给出的消息:./search: cannot execute binary file: Exec format error

search是从脚本调用一个C程序,并在同一文件夹中的各种其他C程序做这个项目。脚本和C程序已经开发出来并且最初是在一个不再可用的Unix/Linux机器上执行的,所以我被要求尝试复活这个项目,但在Windows下使用NetBeans中的gcccygwin

消息:./search: cannot execute binary file: Exec format error最有可能与search没有可执行文件有关。当我尝试建立的C程序我得到以下输出:

C:\cygwin64\bin\make.exe -f Makefile 
gcc -ansi -g -c cbuild.c 
gcc -ansi -g -c complex.c 
gcc -ansi -g -c mylib.c 
gcc -ansi -g -c poly.c 
gcc -ansi -g -c real.c 
gcc -ansi -g -c zero.c 
gcc -lgmp -lm -lrt -o cbuild cbuild.o complex.o mylib.o poly.o real.o zero.o 
real.o: In function `rabs': 
/cygdrive/c/../progs/real.c:9: undefined reference to `__imp___gmpf_abs' 
/cygdrive/c/../progs/real.c:9:(.text+0x1e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___gmpf_abs' 
real.o: In function `radd': 

我认为R_X86_64_PC32指的是我使用的环境。我在Windows 10的64位版本cygwin上使用了64位版本的Netbeansgcc 5.4.0

任何人都可以建议我必须解决这个问题,以便我可以建立C程序?

+0

Cygwin的是没有Linux/Unix模拟器。 – Olaf

+0

是否编译,链接并运行一个简单的“* hello,world *”(http://stackoverflow.com/documentation/c/213/hello-world/795/hello-world#t=201608131834051452644)? “ – alk

+0

”*不提供运行选项*“错误是什么?通过执行'。/ myprogramname'来执行它......:-S – alk

回答

3

问题是这样的:

gcc -lgmp -lm -lrt -o cbuild cbuild.o complex.o mylib.o poly.o real.o zero.o 

默认情况下,链接器将链接库和对象在命令行上指定的顺序,并且,链接库时,将只包括由事需要的码元它在命令行上的之前。由于-lgmp是第一个,因此还有(至今)没有出色的符号(main除外),因此库中不包含任何符号。当后来的物体需要它的符号时,它们不会看到它们。

顺序更改为

gcc -o cbuild cbuild.o complex.o mylib.o poly.o real.o zero.o -lgmp -lm -lrt 

,它应该工作。或者,使用-Wl,--as_needed链接器选项让链接器记住较早的库并重新链接它们,如果更多的符号被更新的对象文件引用(需要最新版本的GNU链接器 - 我不知道它是否适用于cygwin) 。


这种乱序通常是一个破碎的Makefile的症状。正常的Makefile结构有一堆变量,这些变量被设置为控制知道如何编译源文件和链接目标文件的默认规则。有关用于连接的两个变量是LDFLAGSLDLIBS,而不同的是,LDFLAGS自带的命令行上之前所有的目标文件和LDLIBS所有的目标文件。

所以为了使事情工作,你需要确保所有的-l期权和其他库在LDLIBS

LDLIBS = -lgmp -lrt -lm 

LDFLAGS

+0

只要我能解决如何做到这一点。 –

+0

我的makefile有'LIBS = -lgmp -lm -lrt',但没有'LDLIBS'或'LDFLAGS'。 –

+0

@MrMorgan:所以你的Makefile非常不标准 - 你需要看看'$(LIBS)'是如何被使用的,并且修复它以确保它们在命令行上的目标文件之后。 –