Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Mac上编译C程序,但可以在Linux上编译_Linux_Macos_Gcc_Compiler Errors_Clang - Fatal编程技术网

无法在Mac上编译C程序,但可以在Linux上编译

无法在Mac上编译C程序,但可以在Linux上编译,linux,macos,gcc,compiler-errors,clang,Linux,Macos,Gcc,Compiler Errors,Clang,我在本地机器上编译编程作业时遇到了一些问题。该程序通过makefiles和编译命令分发给我们,这些文件和命令在学校的科学Linux服务器上工作。我的本地机器是Mac OS X El Capitan 当我在Mac上编译运行make的程序时,出现以下错误,导致编译无法继续: myid-MacBook-Pro:mp6 myid$ make gcc -g -lm -std=c99 -Wall -Werror -c lodepng.c clang: error: -lm: 'linker' input

我在本地机器上编译编程作业时遇到了一些问题。该程序通过makefiles和编译命令分发给我们,这些文件和命令在学校的科学Linux服务器上工作。我的本地机器是Mac OS X El Capitan

当我在Mac上编译运行make的程序时,出现以下错误,导致编译无法继续:

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而不是clang:

[netid@linux-a2 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
在makefile中,以下是变量定义:

CC=gcc
CFLAGS=-g -lm -std=c99 -Wall -Werror 
以及loadpng.o的目标定义

lodepng.o: lodepng.c
$(CC) $(CFLAGS) -c lodepng.c
如果能帮助我理解并克服这个错误,我将不胜感激

多谢各位


另外,在这一点上,我想我应该说我已经注意到了Clang和GCC之间的细微差别。在我看来,即使是由Clang生成的警告也会阻止编译继续进行,因此警告的行为类似于错误。但是对于GCC,如果它生成警告,它仍然编译对象文件。如果我弄错了,请纠正我。

现在,您的Mac上出现编译错误,因为您试图将链接器命令(即-lm)传递到编译(即-c)中。编译源文件时提供链接标志(-c标志)

在您提供的另一个编译片段中,未使用的linker命令似乎未被注意到,这不是一件好事


对于您的最后一个问题,flag-Werror应该强制所有编译警告变成错误——这正是您所描述的。

好的,非常感谢您的澄清!那么它真的很有趣,这是否意味着vanilla GCC似乎没有强制消除未使用的链接器命令?难怪Clang会成为首选编译器!