我正在尝试this libPNG示例,但是编译失败。我使用gcc -lm -lpng makePNG.c
进行编译,并收到以下错误:
/tmp/ccgGO8zw.o: In function `writeImage':
makePNG.c:(.text+0x360): undefined reference to `setRGB'
collect2: error: ld returned 1 exit status
我删除了函数定义,只是简单地移动了函数,使其顺序如下:
void setRGB(png_byte *ptr, float val)
int writeImage(char* filename, int width, int height, float *buffer, char* title)
float *createMandelbrotImage(int width, int height, float xS, float yS, float rad, int maxIteration)
int main(int argc, char *argv[])
它奏效了。我的问题是:为什么以前不起作用? SetRGB是在writeImage之前定义的,那么如何不确定'setRGB'引用呢?
编辑:
我忘了提一些我现在意识到非常重要的事情。我从setRGB函数中删除了“ inline”关键字。我尝试使用inline关键字进行编译,但它具有相同的错误消息。因此,很明显,我的问题与inline关键字有关,而不是与我最初认为的前向声明有关。
答案 0 :(得分:1)
感谢David C. Rankin,我找到了一个可以对此进行编译的命令。 gcc -Ofast -lm -lpng makePNG.c
之所以有效,是因为它包含-Ofast选项。这是man gcc
中该选项的描述:
-Ofast
无视严格的标准合规性。
-Ofast启用所有-O3优化。它还启用了并非对所有符合标准的程序都有效的优化。它打开 -ffast-math和特定于Fortran的-fno-protect-parens和-fstack-arrays。
我怀疑作者使用内联的方式不符合c规范,这就是为什么没有此选项就无法编译的原因。不用说,编写不符合c标准的代码永远都不行。
编辑:
证明-Ofast选项是罪魁祸首:
$ gcc -Ofast -lm -lpng makePNG.c
$ gcc -lm -lpng makePNG.c
/tmp/cc2JlymP.o: In function `writeImage':
makePNG.c:(.text+0x360): undefined reference to `setRGB'
collect2: error: ld returned 1 exit status
$