【发布时间】:2019-03-18 16:51:14
【问题描述】:
我正在尝试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 关键字有关,而不是我最初认为的前向声明...
【问题讨论】:
-
示例编译和构建很好看Resulting .png尝试
gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o libpngex libpngex.c -lm -lpng然后运行./libpngex output.png -
inline关键字只是对编译器的“提示”,它可以内联函数。不能保证它会做到。但是,函数declaration 和函数definition 之间必须保持一致。您不能将inline放在一个上而不是另一个上——它们将被视为两个不同的函数。 -
对不起@sam,你很困惑。我的来源名称是
libpngex.c。只需使用您的makePNG,例如gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o makePNG -lm -lpng makePNG.c然后运行./makePNG somepng.png -
您发布的是
gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o libpngex makePNG.c -lm -lpng makePNG.c。删除其中一个makePNG.c,您的输出将位于libpngex或删除libpngex并从第一个'.c'中删除'.c'。 -
如果您仔细查看您发布的
gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o libpngex makePNG.c -lm -lpng makePNG.c的命令,您包含了makePNG.c两次。这就是导致‘code’ might be clobbered...警告的原因。