编译libPNG示例时未定义参考

时间:2018-10-13 19:52:58

标签: c libpng

我正在尝试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关键字有关,而不是与我最初认为的前向声明有关。

1 个答案:

答案 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
$