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



我的标题中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"),但如果你想要它,它就在那里。

最新更新