【问题标题】:Unable to compile C program on Mac, but able to compile on Linux无法在 Mac 上编译 C 程序,但可以在 Linux 上编译
【发布时间】:2016-03-04 23:28:20
【问题描述】:

我在本地计算机上编译我的编程作业时遇到了一些问题。该程序与已知可在学校的 Scientific Linux 服务器上运行的 makefile 和编译命令一起分发给我们。我的本地机器是 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,如果它产生警告,它仍然会编译目标文件。如果我错了,请纠正我。

【问题讨论】:

    标签: linux macos gcc compiler-errors clang


    【解决方案1】:

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

    在您提供的另一个编译 sn-p 中,未使用的链接器命令似乎被忽略了,这不是一件好事。

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

    【讨论】:

    • 好的,非常感谢您的澄清!那么它真的很有趣,这是否意味着香草 GCC 似乎没有强制消除未使用的链接器命令?难怪 Clang 正在成为首选编译器!
    猜你喜欢
    • 2013-09-25
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2017-07-07
    • 2017-08-25
    • 2011-11-22
    相关资源
    最近更新 更多