C ++模板类绑定到nodejs

时间:2013-07-01 18:02:16

标签: c++ node.js templates binding

我想创建包含C ++类模板的nodejs addon。我将示例类从“Wrapping C++ objects”教程转换为模板。它编译时没有错误但是在使用它时会出错。

node: symbol lookup error: /home/me/projects/node-template/build/Release/addon.node: undefined symbol: _ZN8MyObjectIdE4InitEN2v86HandleINS1_6ObjectEEE

addon.cc:

<...>
void InitAll(Handle<Object> exports) {
    MyObject<double>::Init(exports);
}
<...>

myobject.cc:

<...>
template <typename T>
MyObject<T>::MyObject() {};

template <typename T>
MyObject<T>::~MyObject() {};

template <typename T>
void MyObject<T>::Init(Handle<Object> exports) {
<...>

myobject.h:

<...>
template <typename T>
class MyObject : public node::ObjectWrap {
    public:
        static void Init(v8::Handle<v8::Object> exports);

    private:
        MyObject();
        ~MyObject();

        static v8::Handle<v8::Value> New(const v8::Arguments& args);
        static v8::Handle<v8::Value> PlusOne(const v8::Arguments& args);
        T counter_;
};

1 个答案:

答案 0 :(得分:0)

C ++模板排除了单独的编译单元,至少你是在这里完成的。您的addon.cc想要MyObject<double>,并假设它将在稍后定义(并在运行时动态链接期间解析)。但myobject.cc并不知道您需要double - 实例化MyObject,因此编译器在生成myobject.o时不会生成它。

要解决您的困境,只需将myobject.cc的内容放入myobject.h即可。也就是说,将MyObject定义放在头文件中;不要把它留作单独的编译单元。