我想创建包含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_;
};
答案 0 :(得分:0)
C ++模板排除了单独的编译单元,至少你是在这里完成的。您的addon.cc
想要MyObject<double>
,并假设它将在稍后定义(并在运行时动态链接期间解析)。但myobject.cc
并不知道您需要double
- 实例化MyObject
,因此编译器在生成myobject.o
时不会生成它。
要解决您的困境,只需将myobject.cc
的内容放入myobject.h
即可。也就是说,将MyObject
的定义放在头文件中;不要把它留作单独的编译单元。