LINUX.ORG.RU

[C/C++] использование Python.h и png.h в одном модуле


0

1

Неожиданно вылезла проблема при включении Python.h и png.h в один модуль. Если png.h идет первым, сыпятся ворнинги (с -Wall)

In file included from /usr/include/python2.6/Python.h:8,
                 from src/../include/image.hpp:5,
                 from src/image.cpp:5:
/usr/include/python2.6/pyconfig.h:1031:1: warning: "_POSIX_C_SOURCE" redefined
In file included from /usr/include/malloc.h:24,
                 from src/image.cpp:1:
/usr/include/features.h:158:1: warning: this is the location of the previous definition
In file included from /usr/include/python2.6/Python.h:8,
                 from src/../include/image.hpp:5,
                 from src/image.cpp:5:
/usr/include/python2.6/pyconfig.h:1040:1: warning: "_XOPEN_SOURCE" redefined
In file included from /usr/include/malloc.h:24,
                 from src/image.cpp:1:
/usr/include/features.h:160:1: warning: this is the location of the previous definition

Если Python.h идет первым, вылетает ощибка

In file included from /usr/include/python2.6/Python.h:8,
                 from src/../include/image.hpp:5,
                 from src/image.cpp:2:
/usr/include/python2.6/pyconfig.h:1031:1: warning: "_POSIX_C_SOURCE" redefined
In file included from /usr/include/malloc.h:24,
                 from src/image.cpp:1:
/usr/include/features.h:158:1: warning: this is the location of the previous definition
In file included from /usr/include/python2.6/Python.h:8,
                 from src/../include/image.hpp:5,
                 from src/image.cpp:2:
/usr/include/python2.6/pyconfig.h:1040:1: warning: "_XOPEN_SOURCE" redefined
In file included from /usr/include/malloc.h:24,
                 from src/image.cpp:1:
/usr/include/features.h:160:1: warning: this is the location of the previous definition
In file included from /usr/include/png.h:518,
                 from src/image.cpp:6:
/usr/include/pngconf.h:371: error: expected constructor, destructor, or type conversion before ‘.’ token
/usr/include/pngconf.h:372: error: ‘__dont__’ does not name a type

Кто нить может сказать что с этим делать, кроме как разнести использование png.h и Python.h по разным модулям?

★★★★★

Вообще тут говорится:

Note Since Python may define some pre-processor definitions which affect the standard headers on some systems, you must include Python.h before any standard headers are included.

Так что png.h до Python.h инклюдить точно не надо.

fluorite ★★★★★ ()

Открой /usr/include/pngconf.h, прочитай, что написано, затем прочитай, что написано в конце файла INSTALL в исходниках libpng.

Если кратко, то нужно закомментировать две строчки в /usr/include/pngconf.h

anonymous ()

я бы разнес это по двум сишникам и не парил бы мозг

Reset ★★★★★ ()
Ответ на: комментарий от anonymous

и так делать на каждой машине где собираешь? это неправильно

Reset ★★★★★ ()
Ответ на: комментарий от true_admin

Это понятно, но это костыль. Авторы не даром же поставили эту проверку... хотелось бы знать какие могут от этого потом грабли.

AIv ★★★★★ ()

Не можешь сам - посмотри у соседа

/* For linux, png.h must be imported before Python.h because
   png.h needs to be the one to define setjmp.
   Undefining _POSIX_C_SOURCE and _XOPEN_SOURCE stops a couple
   of harmless warnings.
*/

#ifdef __linux__
#   include <png.h>
#   ifdef _POSIX_C_SOURCE
#       undef _POSIX_C_SOURCE
#   endif
#   ifdef _XOPEN_SOURCE
#       undef _XOPEN_SOURCE
#   endif
#   include "Python.h"
#else

/* Python API mandates Python.h is included *first* */
#   include "Python.h"

#   include <png.h>
#endif

http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/src/_png.cpp?revision=8988&view=markup

vasilenko ★★ ()
Ответ на: комментарий от AIv

Это понятно, но это костыль

костыль это то что они внутри сделали. Кроме того, по-хорошему, Python.h надо включать до png.h.

tmp$ cat ./test.c 
#include <python2.6/Python.h>
#define PNG_SKIP_SETJMP_CHECK 1
#include <png.h>

int main(void) {

    return 0;
}
tmp$ gcc -Wall ./test.c 
true_admin ★★★★★ ()
Ответ на: комментарий от pathfinder

Типа идея в том что в линухе есть две реализации setjmp(пруфов не нашёл), не совместимые между собой. И у обоих есть setjmp.h. Так вот libpng пытается не допустить включения различных версий setjmp.h. Только делает как-то это через опу.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

То есть не через опу - это отменить эту поверку?

У меня напр (debian 6.0)

aiv@aivbook:~/Projects/aivlib$ locate setjmp.h
/usr/include/setjmp.h
/usr/include/bits/setjmp.h
второй включается через bits/, но не факт что в остальных дистрах так же...

AIv ★★★★★ ()
Ответ на: комментарий от AIv

То есть не через опу - это отменить эту поверку?

предложи лучшее решение.

второй включается через bits/

второй подключается в первом. Всё что в bits это только для служебного пользования, напрямую эти хедеры не подключаются.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

> предложи лучшее решение.

Не могу - не чувствую критериев качества в данном случае;-( Ок, спасибо.

AIv ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.