我的标题中sample.h
这个:
#include <iostream>
#ifdef SWIG
int a = 0;
#endif
在我的sample.i
中:
%module sample
%{
#include "sample.h"
%}
#include "sample.h"
但是,我认为有和没有 #ifdef SWIG之间没有任何区别......
你能告诉我在哪里以及如何找到差异吗,它会是什么?
多谢!
您的 .i 文件有错误。最后一行应该是%include
而不是#include
。 通过此更改,构建包装器(我使用的是 Python)会产生:
sample_wrap.cxx
sample_wrap.cxx(3200) : error C2065: 'a' : undeclared identifier
sample_wrap.cxx(3211) : error C2065: 'a' : undeclared identifier
这是因为在编译时,#include
期间未定义 SWIG,并且a
在生成的代码中不存在。 当 SWIG 处理%include
时,将定义 SWIG 并为不存在的a
生成接口。
删除 #if
包装器会生成正确包装的全局变量:
>>> import sample
>>> sample.cvar.a
0
有一个解决方案:如果你在CMake中编译上面的代码,你可以为你的接口文件设置传播到附加的header&c++文件的CXX_COMPILE_FLAGS。因此:
SET_SOURCE_FILES_PROPERTIES(sample.i PROPERTIES CPLUSPLUS ON)
if(CMAKE_BUILD_TYPE MATCHES "Release")
SET_SOURCE_FILES_PROPERTIES(sample.i PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -DSWIG")
SET_SOURCE_FILES_PROPERTIES(sample.i PROPERTIES CXX_COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -DSWIG")
else(CMAKE_BUILD_TYPE MATCHES "Release")
SET_SOURCE_FILES_PROPERTIES(sample.i PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -DSWIG")
SET_SOURCE_FILES_PROPERTIES(sample.i PROPERTIES CXX_COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -DSWIG")
endif()
SWIG_ADD_MODULE(sample python sample.i sample.cpp)
SWIG_LINK_LIBRARIES(Vector ${PYTHON_LIBRARIES})
在这种情况下,编译是有条件的(如果你省略了CXX_COMPILE_FLAGS部分,则没有"a"),但如果你想要它,它就在那里。