当我们有SWIG TCL静态链接时,枚举不会传递给TCL

时间:2016-10-17 04:46:30

标签: c++ enums tcl swig static-linking

继续提问

how to pass enum values from TCL script to C++ class using Swig

我有以下代码

1)文件:example.i

%module example
%{
      /* Put header files here or function declarations like below */
      #include "example.h"
%}

%include "example.h"

2文件example.h

class myClass {
    public:
        enum Type {one,two};
         myClass() {}
        static bool printVal(int val);
        static bool printEnum(Type val);
};

3)文件example.cpp

 #include  "example.h"
 #include <iostream>
 using namespace std;

 bool myClass::printVal(int val) {
    cout << " Int Val = " << val << endl;
    return 0;
 }

 bool myClass::printEnum(type val) {
    cout << " Enum Val = " << val << endl;
    return 0;
 }  

如果我以共享库的形式链接swig文件,它可以正常工作

swig -c++ -tcl example.i
g++ -c -fpic example_wrap.cxx example.cpp -I/usr/local/include
g++ -shared example.o example_wrap.o -o example.so
setenv LD_LIBRARY_PATH /pathtoexample.so:$LD_LIBRARY_PATH
tclsh
% load example.so
% myClass_printVal $myClass_one

但如果swig代码和示例。*文件静态链接,我会收到以下错误

 % myClass_printVal $myClass_one
 can't read "myClass_one": no such variable

期待指导/帮助

1 个答案:

答案 0 :(得分:0)

首先,如果您使用更多共享库的路径,则无需更改LD_LIBRARY_PATH变量。如果它在当前目录中(便于测试),您可以这样做:

load ./example.so

当它与当前脚本位于同一目录中时,您可以使用相当长的版本:

load [file join [file dirname [info script]] example.so]
# This also probably works:
#load [file dirname [info script]]/example.so

其次,您应该检查示例实际创建的内容;它可能只是使用与您期望的不同的名称。您可以使用info commandsinfo varsnamespace children来查找此信息;它们列出了当前可见的命令,变量和命名空间。

[来自可见性评论的编辑]:变量位于::swig命名空间中。