2015-02-25 1 views
0

Я разрабатываю библиотеку C++, в которой SWIG используется для создания своей оболочки Python. Некоторые из моих файлов на C++ используют <inittypes.h> для вызова PRId64 и других макросов в sprintf.Как предотвратить <Python.h> из Python 2.7 из <inttypes.h> в оболочке Python, созданной SWIG?

Я смог скомпилировать мою библиотеку с Python 2.6 и GCC 4.4.7 на Scientific Linux 6 (клон RHEL6), но Python 2.7 и GCC 4.8.2 на Scientific Linux 7 (клон RHEL7) вызвали много ошибок, как показано ниже.

/home/oxon/libTARGET/inc/target/T2EvalBoard.h:562:145: warning: too many arguments for format [-Wformat-extra-args] 
In file included from /home/oxon/libTARGET_build/src/targetPYTHON_wrap.cxx:3117:0: 
/home/oxon/libTARGET/inc/target/BaseCameraModule.h: In member function ‘virtual void TARGET::BaseCameraModule::ReceiveEvent(uint32_t&, uint8_t**)’: 
/home/oxon/libTARGET/inc/target/BaseCameraModule.h:211:66: error: expected ‘)’ before ‘PRIu32’ 
    sprintf(str, "Cannot read event data. Requested length is %" PRIu32 " bytes, but only %" PRId64 " bytes were read.", length, fBytesReturned); 

Я знаю, что я должен добавить следующие строки в файлы заголовков первого для того, чтобы использовать PRId64 и другие.

#define __STDC_FORMAT_MACROS 
#include <inttypes.h> 

Но targetPYTHON_wrap.cxx, что исходный файл, созданный с помощью SWIG, включает <Python.h> в начале файла, и поэтому приведенные выше строки игнорируются. В самом деле, следующий код не может быть скомпилирован, поскольку <Python.h> включает в себя <inttypes.h>.

#include <Python.h> 

#define __STDC_FORMAT_MACROS 
#include <inttypes.h> 

#include <stdio.h> 

int main() 
{ 
    printf("Output: " PRIu32 "\n", 100); 
    return 0; 
} 

Как использовать PRId64 и другие макросы с <Python.h> и SWIG?

ответ

1

В SWIG, следующий добавляет строки в самой верхней части SWIG оболочки, поэтому он будет определен до Python.h:

%begin %{ 
#define __STDC_FORMAT_MACROS 
#include <inttypes.h> 
%} 
0

Я добавил -D__STDC_FORMAT_MACROS в CXX_FLAGS, но ищет лучшего решения, если существует.

Смежные вопросы