无法在Mac上编译C程序,但能够在Linux上编译

时间:2016-03-04 23:28:21

标签: linux macos gcc compiler-errors clang

我在本地计算机上编译编程时遇到了一些麻烦。该程序通过makefiles和编译命令分发给我们,这些命令已知在学校的Scientific 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,如果它产生警告,它仍然会编译目标文件。如果我弄错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

现在你在Mac上遇到编译错误,因为你试图将链接器命令(即-lm)传递给编译(即-c)。编译(-c标志)源文件时,Do not会给出链接标志。

在您提供的其他编译片段中,未使用的链接器命令似乎没有被注意到,这不是一件好事。

对于你的上一个问题,标志-Werror应强制所有编译警告变成错误 - 这正是你所描述的。