Windows中的gcc无法编译为Unix / Linux编写的C程序

时间:2016-08-13 18:28:53

标签: c windows shell gcc cygwin

我是一个Unix / Linux新手,他试图运行一个由没有留下任何文档并且已经解散的人编写的shell脚本。该脚本包含行:

./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指的是我正在使用的环境。我在Netbeans的64位版本的gcc 5.4.0中使用64位版本的cygwinWindows 10

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

1 个答案:

答案 0 :(得分: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命令行上的所有目标文件之前来自 {{1 之后所有目标文件。

因此,为了使工作正常,您需要确保所有LDLIBS选项和其他库都在-l中:

LDLIBS
LDLIBS = -lgmp -lrt -lm

中的

NOT