2012-10-31 32 views
2

一個基本的緩衝區長度::操作,我花了一段簡單的代碼從核心的NodeJS(加密):在node-gyp編譯這個時候節點GYP崩潰關於不兼容的類型

ASSERT_IS_BUFFER(args[0]); 
ssize_t klen = Buffer::Length(args[0]); 

但是我自己的原生擴展,我得到以下錯誤:

../deps/v8/include/v8.h:202:5: error: assigning to 'v8::Object *volatile' from incompatible type 
     'v8::Value *' 
    TYPE_CHECK(T, S); 
    ^
../deps/v8/include/v8.h:145:37: note: expanded from macro 'TYPE_CHECK' 
    *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);  \ 
            ^
../src/openssljs.cc:300:33: note: in instantiation of function template specialization 'v8::Handle<v8::Object>::Handle<v8::Value>' 
     requested here 
       ssize_t klen = Buffer::Length(args[0]); 
              ^

任何想法可能是什麼原因造成這種情況?

回答

3

您從一個版本的節點(例如HEAD)獲取這些行,但系統中的頭文件屬於其他版本的節點。

在舊版本Buffer::Length正在接受v8::Handle<v8::Object>而在較新的版本中接受v8::Handle<v8::Value>匹配args[0]的類型。

提交改變了簽名:https://github.com/joyent/node/commit/c8c638a84195e5571f4ece881375909e1f4b82a8

您可以更新Node.js的系統中安裝或使用有明確的轉換:args[0].As<Object>()

+1

的明確的轉換工作,但奇怪的是,我確實有節點V0 .8.14安裝在我的系統上(OSX macports)。我確實在'/ opt/local/include/node'中有錯誤的標題。 – Olivier