Неопределенная ссылка при компиляции примера libPNG - PullRequest
0 голосов
/ 13 октября 2018

Я пробовал этот пример 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' может быть неопределенной?

Редактировать:

Я забыл упомянуть кое-что, что теперь я понимаю, очень важно.Я удалил ключевое слово inline из функции setRGB.Я попытался скомпилировать с ключевым словом inline, и у него было то же сообщение об ошибке.Ясно, что моя проблема связана с ключевым словом inline, а не с предварительными объявлениями, как я изначально думал ...

1 Ответ

0 голосов
/ 13 октября 2018

Благодаря Дэвиду К. Ранкину я нашел команду, которая работает для компиляции.gcc -Ofast -lm -lpng makePNG.c работает, потому что включает опцию -Ofast.Это описание этой опции в man gcc:

-Ofast

Не учитывать строгое соответствие стандартам.

-Ofast включает все оптимизации -O3.Он также позволяет выполнять оптимизации, которые не подходят для всех стандартных программ.Он включает -ffast-math и специфичные для Фортрана -fno-protect-parens и -fstack-arrays.

Я подозреваю, что автор использует inline не соответствует спецификации 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
$ 
...