我正在开发一个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一起使用?
答案 0 :(得分:1)
在SWIG中,以下内容在SWIG包装器的最顶部添加了行,因此它将在Python.h
之前定义:
%begin %{
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
%}
答案 1 :(得分:0)
我在-D__STDC_FORMAT_MACROS
中添加了CXX_FLAGS
,但是如果存在,则寻找更好的解决方案。