如何防止 Python 2.7 的 <Python.h> 在 SWIG 生成的 Python 包装器中包含 <inttypes.h>?
How to prevent <Python.h> of Python 2.7 from including <inttypes.h> in a Python wrapper generated by SWIG?
我正在开发一个 C++ 库,其中 SWIG 用于生成其 Python 包装器。我的一些 C++ 文件使用 <inittypes.h>
调用 PRId64 和 sprintf 中的其他宏。
我能够在 Scientific Linux 6(RHEL6 克隆)上使用 Python 2.6 和 GCC 4.4.7 编译我的库,但是在 Scientific 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 一起使用?
我在 CXX_FLAGS
中添加了 -D__STDC_FORMAT_MACROS
,但正在寻找更好的解决方案(如果存在的话)。
在 SWIG 中,以下代码将行添加到 SWIG 包装器的最顶部,因此它将在 Python.h
之前定义:
%begin %{
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
%}
我正在开发一个 C++ 库,其中 SWIG 用于生成其 Python 包装器。我的一些 C++ 文件使用 <inittypes.h>
调用 PRId64 和 sprintf 中的其他宏。
我能够在 Scientific Linux 6(RHEL6 克隆)上使用 Python 2.6 和 GCC 4.4.7 编译我的库,但是在 Scientific 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 一起使用?
我在 CXX_FLAGS
中添加了 -D__STDC_FORMAT_MACROS
,但正在寻找更好的解决方案(如果存在的话)。
在 SWIG 中,以下代码将行添加到 SWIG 包装器的最顶部,因此它将在 Python.h
之前定义:
%begin %{
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
%}