ошибка компиляции plotutils с png 1.6.25: указатель разыменования на неполный тип

#c #png #graphics2d

#c #png #graphics2d

Вопрос:

На моем компьютере RedHat 7 Linux (gcc 4.8.3) у меня установлен png-dev (1.6.25).
Пытаюсь собрать plotutils-2.6 (я проверил, что он был обновлен в последний раз в 2009 году). ./configure успешно. Проблема на шаге выполнения с ошибкой:

 gcc -DHAVE_CONFIG_H -I. -I.. -I./../include -DLIBPLOT -O2 -MT z_write.lo -MD -MP -MF .deps/z_write.Tpo -c z_write.c  -fPIC -DPIC -o .libs/z_write.o
In file included from /usr/local/include/pngconf.h:50:0,
                 from /usr/local/include/png.h:371,
                 from z_write.c:43:
z_write.c: In function '_pl_z_maybe_output_image':
z_write.c:167:22: error: dereferencing pointer to incomplete type
   if (setjmp (png_ptr->jmpbuf))
                      ^
z_write.c: In function '_our_error_fn_stdio':
z_write.c:447:19: error: dereferencing pointer to incomplete type
   longjmp (png_ptr->jmpbuf, 1);
                   ^
  

Вопрос № 1: Библиотека plotutils все еще активно поддерживается? Если нет, есть ли альтернатива для программистов на C ?

Кто-нибудь из вас сталкивался с этой проблемой раньше и исправлял ее?

Комментарии:

1. Очевидно, для этого требуется libpng-1.2.x

2. Спасибо, Гленн. ДА. Я смог скомпилировать plotutils на старых машинах. Мой libpng слишком новый. В любом случае, я нашел способ скомпилировать с новым png.

Ответ №1:

Я выяснил источник проблемы. Ответ приведен в: http://www.libpng.org/pub/png/src/libpng-1.2.x-to-1.4.x-summary.txt .

Цитата из ссылки

 d. Direct access to png_ptr->jmpbuf has been deprecated since libpng
      version 1.0.6, and libpng now generates a warning about it.

      To avoid such warnings, change
        setjmp(png_ptr->jmpbuf)
      to
        setjmp(png_jmpbuf(png_ptr))
  

Файл libplot/z_write.c в библиотеке plotutils нуждается в обновлении:

в строке 167:

 /*if (setjmp (png_ptr->jmpbuf)) */
if (setjmp (png_jmpbuf(png_ptr)))
  

строка 448:

 /*longjmp (png_ptr->jmpbuf, 1); Kemin changed this*/
longjmp(png_jmpbuf(png_ptr), 1);
  

Эти два исправления порадовали компилятор. Если вы хотите, чтобы plotutils работал с png 1.2 или более ранней версии без редактирования кода, вы можете использовать условную компиляцию на основе версии библиотеки png. Остается вопрос, активно ли поддерживаются plotutils?

Комментарии:

1. Я не думаю, что вам нужно выполнять условную компиляцию. Макрос png_jmpbuf() доступен с версии libpng-1.0.6 от марта 2000 года.

2. Гленн, ты пишешь. В принципе, старый стиль кодирования должен исчезнуть.