我的标题sample.h
中有:
#include <iostream>
#ifdef SWIG
int a = 0;
#endif
在我的sample.i
中:
%module sample
%{
#include "sample.h"
%}
#include "sample.h"
但是,我认为没有#ifdef SWIG ...
之间有任何区别你能告诉我在哪里以及如何找到差异,它会是什么?
非常感谢你!
答案 0 :(得分:1)
您的.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
答案 1 :(得分:0)
有一个解决方案:如果你在CMake中编译上面的代码,你可以为你的接口文件设置CXX_COMPILE_FLAGS,它们传播到附加的头文件和c ++文件。就这样:
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部分,那里没有&#34; a&#34;),但是如果你想要它那么。