2016-03-04 89 views
-1

我在本地機器上編譯我的編程任務時遇到了一些麻煩。該程序通過已知可在學校科學Linux服務器上運行的makefile和編譯命令分發給我們。我的本地機器是Mac OS X El Capitan。無法在Mac上編譯C程序,但能夠在Linux上編譯

當我編譯我的程序運行讓我的Mac上,我得到以下錯誤,防止編輯從程序:

myid-MacBook-Pro:mp6 myid$ make 
gcc -g -lm -std=c99 -Wall -Werror -c lodepng.c 
clang: error: -lm: 'linker' input unused 
make: *** [lodepng.o] Error 1 

但是,當我推的是同樣的代碼,正在進行的Linux服務器的工作,在那裏編譯,一切正常。 Linux服務器使用gcc而不是鏗鏘:

[[email protected] mp6]$ make 
gcc -g -lm -std=c99 -Wall -Werror -c functions.c 
gcc -g -lm -std=c99 -Wall -Werror main.o lodepng.o imageData.o functions.o -o mp6 -lm 
gcc -g -lm -std=c99 -Wall -Werror -c test.c 
gcc -g -lm -std=c99 -Wall -Werror test.o lodepng.o imageData.o functions.o solution.o -o test -lm 

在生成文件中,這些變量的定義:

CC=gcc 
CFLAGS=-g -lm -std=c99 -Wall -Werror 

和loadpng.o目標定義

lodepng.o: lodepng.c 
$(CC) $(CFLAGS) -c lodepng.c 

我會感謝任何幫助理解這個錯誤並克服它。

非常感謝。

另外,在這張紙上,我想我會說我注意到了Clang和GCC之間的細微差別。在我看來,即使Clang生成的警告也會阻止編譯進行,所以警告行爲就像錯誤一樣。但是對於GCC,如果它產生警告,它仍然編譯目標文件。如果我錯了,請糾正我。

回答

0

現在,由於您試圖將鏈接器命令(即-lm)傳遞到編譯(即。-c),因此您在Mac上發生編譯錯誤。 Do not在編譯(-c標記)源文件時會給出鏈接標記。

在您提供的其他編譯片段中,未使用的鏈接器命令似乎通過未被注意的傳遞,這不是一件好事。

對於你最後一個問題,標誌-Werror應該強制所有編譯警告成爲錯誤 - 這正是你所描述的。

+0

好的非常感謝你的澄清!那真的很有趣,這是否意味着GCC似乎不強制消除未使用的鏈接器命令?難怪Clang正在成爲首選的編譯器! – AKKA