C++模板类绑定到nodejs

C++ template class binding to nodejs

本文关键字:nodejs 绑定 C++      更新时间:2023-10-16

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

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_;
};

C++模板排除了单独的编译单元,至少在这里是这样做的。您的addon.cc想要一个MyObject<double>,假设它稍后会定义(并在运行时的动态链接过程中解析)。但是myobject.cc不知道您想要一个double实例化的MyObject,所以编译器在生成myobject.o时不会生成它。

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