2016-08-13 85 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)'是如何被使用的,並且修復它以確保它們在命令行上的目標文件之後。 –