【问题标题】:#ifdef SWIG : When does this conditional compilation is taken into consideration?#ifdef SWIG:什么时候考虑这个条件编译?
【发布时间】:2014-03-01 20:02:40
【问题描述】:

我的标题中有 sample.h 这个:

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

在我的sample.i 这个:

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

%}
#include "sample.h"

但是,我看不出有和没有#ifdef SWIG 之间有什么区别......

您能告诉我在哪里以及如何找到不同之处吗?会是什么?

非常感谢!

【问题讨论】:

  • 您希望看到什么不同?你只是创建了一个全局变量,你并没有真正使用它......
  • 我希望在生成的 *.cxx 文件中找到它,对我来说它是 sample_wrap.cxx。但是我对变量a 什么也没有发现......所以也许你的意思是“我看不到的全局变量”a 将在 SWIG 编译时创建?那么我在哪里可以使用它呢?是否仅在#ifdef #endif 之间?
  • C++ 中的 #include 不像 PHP 中的 include 那样工作。它实际上并没有将代码从一个文件放入另一个文件,它只是让它对编译器可见。谷歌“C++ 预处理器指令”以获得更多帮助。
  • 使用#ifdef SWIG 的目的是将SWIG 指令放入编译器不会看到的文件中。它们以 % 开头。 int a = 0; 不是 SWIG 指令。您必须使用 RTFM,至少第 1.7 章
  • 你用来生成 _wrap.cxx 文件的 swig 命令是什么?

标签: c++ wrapper swig


【解决方案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

这是因为在编译 SWIG 时未定义 #include 并且 a 在生成的代码中不存在。当 SWIG 处理 %include 时,SWIG 被定义并为 a 生成一个不存在的接口。

删除 #if 包装器会生成正确包装的全局变量:

>>> import sample
>>> sample.cvar.a
0

【讨论】:

    【解决方案2】:

    对此有一个解决方案:如果您在 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 部分,则没有“a”),但如果您想要它,它就在那里。

    【讨论】:

    • if 这里的两个分支不一样吗?
    • 不。在功能上,顶部为发布版本添加标志(例如CMAKE_CXX_FLAGS),底部为调试版本添加它们(例如CMAKE_CXX_FLAGS_DEBUG)。括号中的else 条件相同,表示CMAKE 解析器这个特定的else 对应于相同条件的if 语句。
    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多