0

我想创建 nodejs 插件包装 C++ 类模板。我将示例类从“包装 C++ 对象”教程转换为模板。它编译没有错误,但我在使用它时出错。

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

插件.cc:

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

我的对象.cc:

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

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

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

我的对象.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_;
};
4

1 回答 1

0

C++ 模板排除了单独的编译单元,至少你在这里所做的那样。您addon.cc想要 a MyObject<double>,并假设它将在以后定义(并在运行时动态链接期间解决)。但myobject.cc不知道你想要一个double-instantiated MyObject,所以编译器在生成时不会产生它myobject.o

为了解决您的困境,只需将 的内容myobject.cc放入myobject.h. 即,将 的定义放在MyObject你的头文件中;不要将其作为单独的编译单元。

于 2013-07-01T18:11:56.560 回答