#ifdef SWIG:这个条件编译什么时候考虑?

时间:2014-03-01 20:02:40

标签: c++ wrapper swig

我的标题sample.h中有:

#include <iostream>
#ifdef SWIG
int a = 0;
#endif

在我的sample.i中:

%module sample
%{
   #include "sample.h"

%}
#include "sample.h"

但是,我认为没有#ifdef SWIG ...

之间有任何区别

你能告诉我在哪里以及如何找到差异,它会是什么?

非常感谢你!

2 个答案:

答案 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;),但是如果你想要它那么。