如何防止Python 2.7的<python.h>在SWIG生成的Python包装器中包含<inttypes.h>?</inttypes.h> </python.h>

时间:2015-02-25 14:12:44

标签: python c++ swig

我正在开发一个C ++库,其中SWIG用于生成其Python包装器。我的一些C ++文件使用<inittypes.h>来调用sprintf中的PRId64和其他宏。

我能够在Scientific Linux 6(RHEL6克隆)上使用Python 2.6和GCC 4.4.7编译我的库,但是在Scientific Linux 7(RHEL7克隆)上的Python 2.7和GCC 4.8.2产生了许多错误,如下所示。 / p>

/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一起使用?

2 个答案:

答案 0 :(得分:1)

在SWIG中,以下内容在SWIG包装器的最顶部添加了行,因此它将在Python.h之前定义:

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

答案 1 :(得分:0)

我在-D__STDC_FORMAT_MACROS中添加了CXX_FLAGS,但是如果存在,则寻找更好的解决方案。