我在本地计算机上编译编程时遇到了一些麻烦。该程序通过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,如果它产生警告,它仍然会编译目标文件。如果我弄错了,请纠正我。
答案 0 :(得分:0)
现在你在Mac上遇到编译错误,因为你试图将链接器命令(即-lm)传递给编译(即-c)。编译(-c标志)源文件时,Do not会给出链接标志。
在您提供的其他编译片段中,未使用的链接器命令似乎没有被注意到,这不是一件好事。
对于你的上一个问题,标志-Werror应强制所有编译警告变成错误 - 这正是你所描述的。