2017-03-05 86 views
0

我有C++工厂类,它应该在Python脚本中使用:未定义引用本地变量

class CCommandFactory { 
    private: 
     typedef std::map<std::string, IAbstractCommandCreator*>::iterator factory_iter; 
     static std::map<std::string, IAbstractCommandCreator*> m_factory; 
    public: 
     template<class T> 
     static void add(const std::string& id) { 
      factory_iter it = m_factory.find(id); 
      if (it == m_factory.end()) { 
       m_factory[id] = new CCommandCreator<T>(); 
      } 
     } 
     static ICommand* create(const std::string& id, boost::python::list args) { 
      factory_iter it = m_factory.find(id); 
      if (it != m_factory.end()) { 
       std::list<std::string> arguments; 
       for (int i = 0; i < len(args); ++i) { 
        arguments.push_back(boost::python::extract<std::string>(args[i])); 
       } 
       return it->second->create(arguments); 
      } 
      return 0; 
     } 
     ~CCommandFactory() { 
      for (factory_iter it = m_factory.begin(); it != m_factory.end(); ++it) { 
       if (it->second) { 
        delete it->second; 
       } 
      } 
     } 
}; 

这是包装:

BOOST_PYTHON_MODULE(libfrtpsrv) 
{ 
    class_<CCommandFactory, boost::noncopyable>("CCommandFactory", no_init) 
     .def("create_command", &CCommandFactory::create, args("cmd_id", "args"), return_value_policy<manage_new_object>()) 
     .staticmethod("create_command") 
    ; 
} 

代码看起来对我来说是正确的,但是在python脚本的执行失败在最开始:

Traceback (most recent call last): 
    File example.py, line 1, in <module> 
    import wrapper 
    File .../wrapper.py, line 4, in <module> 
    from libfrtpsrv import * 
ImportError: .../daemon/libfrtpsrv.so: undefined symbol: _ZN15CCommandFactory9m_factoryE 

我不知道如何来解决这个问题。

回答

0

可以看到哪些符号与此命令失败:

$ c++filt <<< _ZN15CCommandFactory9m_factoryE 
CCommandFactory::m_factory 

一类的静态成员变量必须在某处被定义在类中声明,只是,一个声明,而不是定义。

的解决方案是在CPP文件中添加的m_factory定义在命名空间内的地方(而不是头文件,否则你会复制符号):

std::map<std::string, IAbstractCommandCreator*> CCommandFactory::m_factory;