2015-07-26 1 views
0

Я работаю над проектом, который использует камеру глубины стереоаппарата ZED для получения расстояния от препятствий. Его SDK написан на C++, и для него требуется CUDA 6.5. Однако мне нужно интегрировать эту программу с другой частью проекта, которая написана в nodejs. Поэтому я решил скомпилировать код ZED как узловой модуль. Я прошел через node addon tutorial. Теперь я написал интерфейс, но после попытки создания проекта с помощью команды «node-gyp configure build» я получил следующую ошибку. Кажется, что модуль zed не был построен. Я понятия не имею, что это за ошибка, и я до сих пор ничего не искал. Может кто-нибудь, пожалуйста, дайте мне несколько направлений? Спасибо.Не удалось создать узел C++ addon

gyp info it worked if it ends with ok 
gyp info using [email protected] 
gyp info using [email protected] | linux | x64 
gyp info spawn python2 
gyp info spawn args [ '/usr/lib/node_modules/node-gyp/gyp/gyp_main.py', 
gyp info spawn args 'binding.gyp', 
gyp info spawn args '-f', 
gyp info spawn args 'make', 
gyp info spawn args '-I', 
gyp info spawn args '/Path/to/My/Project/DepthViewer/node_zed_module/build/config.gypi', 
gyp info spawn args '-I', 
gyp info spawn args '/usr/lib/node_modules/node-gyp/addon.gypi', 
gyp info spawn args '-I', 
gyp info spawn args '/home/joe/.node-gyp/0.12.7/common.gypi', 
gyp info spawn args '-Dlibrary=shared_library', 
gyp info spawn args '-Dvisibility=default', 
gyp info spawn args '-Dnode_root_dir=/home/joe/.node-gyp/0.12.7', 
gyp info spawn args '-Dnode_gyp_dir=/usr/lib/node_modules/node-gyp', 
gyp info spawn args '-Dmodule_root_dir=/Path/to/My/Project/DepthViewer/node_zed_module', 
gyp info spawn args '--depth=.', 
gyp info spawn args '--no-parallel', 
gyp info spawn args '--generator-output', 
gyp info spawn args 'build', 
gyp info spawn args '-Goutput_dir=.' ] 
gyp info spawn make 
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] 
make: Entering directory `/Path/to/My/Project/DepthViewer/node_zed_module/build' 
    CXX(target) Release/obj.target/zed/../src/main.o 
/bin/sh: 1: -DNODE_GYP_MODULE_NAME=zed: not found 
make: [Release/obj.target/zed/../src/main.o] Error 127 (ignored) 
    SOLINK_MODULE(target) Release/obj.target/zed.node 
/bin/sh: 1: -shared: not found 
make: [Release/obj.target/zed.node] Error 127 (ignored) 
    COPY Release/zed.node 
cp: cannot stat ‘Release/obj.target/zed.node’: No such file or directory 
make: *** [Release/zed.node] Error 1 
make: Leaving directory `/Path/to/My/Project/DepthViewer/node_zed_module/build' 
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2 
gyp ERR! stack  at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:269:23) 
gyp ERR! stack  at ChildProcess.emit (events.js:110:17) 
gyp ERR! stack  at Process.ChildProcess._handle.onexit (child_process.js:1074:12) 
gyp ERR! System Linux 3.13.0-58-generic 
gyp ERR! command "node" "/usr/bin/node-gyp" "configure" "build" 
gyp ERR! cwd /Path/to/My/Project/DepthViewer/node_zed_module 
gyp ERR! node -v v0.12.7 
gyp ERR! node-gyp -v v2.0.2 
gyp ERR! not ok 

Это мой binding.gyp:

{ 
    "targets": [ 
    { 
     "target_name": "zed", 
     "sources": [ 
     "../src/main.cpp", 
     ], 
     "include_dirs": [ 
     "/usr/local/zed/include/", 
     "/usr/local/cuda-6.5/include/", 
     "../include/" 
     ], 
    } 
    ] 
} 

Это мой package.json:

{ 
    "name": "zed_depth_viewer", 
    "version": "0.0.0", 
    "description": "Measure depth with zed sdk", 
    "main": "zed_depth.js", 
    "private": true, 
    "gypfile": true, 
    "dependencies": { 
    "bindings": "~1.2.1" 
    } 
} 

И следуя в основном мой интерфейс с узлом: (только начало для тестирования, «initProgram» работает как «основной» для проекта)

void node_main_handle(const FunctionCallbackInfo<Value>& args) { 
    Isolate* isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 

    Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, initProgram); 
    Local<Function> fn = tpl->GetFunction(); 

    // omit this to make it anonymous 
    fn->SetName(String::NewFromUtf8(isolate, "initProgram")); 

    args.GetReturnValue().Set(fn); 
} 

void Init(Handle<Object> exports, Handle<Object> module) 
{ 
    NODE_SET_METHOD(module, "exports", node_main_handle); 
} 

NODE_MODULE(zed, Init) 

Пример использования этого модуля должно быть:

var zed = require('bindings')('zed'); //zed.node will be in './build/Release/' 
var func = zed(); 
func(); 

Не уверен, если это работает, не проверял еще. Я новичок в nodejs.

+0

Запустить 'npm install --verbose', чтобы просмотреть полный журнал. Кажется, что узел не может найти компиляцию, а не 'bin/sh', у вас должна быть строка'/usr/bin/g ++ '. –

+0

Да, @Yan Foto, вы правы. Это моя ошибка, чтобы экспортировать CXX = '- std = C++ 11' (узел сказал мне, что эта сборка требует флага -std = C++ 11 для компиляции), это должен быть экспорт CXX = 'g ++ -std = C++ 11' . Я был введен в заблуждение другой статьей, которую я прочитал ранее. Проблема решена. – j0e1in

ответ

1

Как видно из строки /bin/sh: 1: -DNODE_GYP_MODULE_NAME=zed: not found, компилятор не найден (это должно быть что-то вроде /usr/bin/g++ вместо /bin/sh). Если вы хотите иметь пользовательские флаги передаются Gyp или если вы хотите конкретный компилятор, ваш файл лавочка хотел что-то вроде этого:

{ 
    'make_global_settings': [ 
    ['CXX','/usr/bin/clang++-3.5'], 
    ['LINK','/usr/bin/clang++-3.5'], 
    ], 
    "targets": [ 
    { 
     "target_name": "zed", 
     "sources": [ 
     "../src/main.cpp", 
     ], 
     "include_dirs": [ 
     "/usr/local/zed/include/", 
     "/usr/local/cuda-6.5/include/", 
     "../include/" 
     ], 
     "link_settings": { 
     "libraries": [ // For compiler 
      "-requiredlibs", 
     ], 
     "ldflags": [ // For linker 
      "-L</path/to/libs", 
      "-Wl,-rpath,path/to/libs", 
     ] 
     }, 
     "cflags": [ 
     "-std=c++11" 
     ], 
    } 
    ] 
} 

выше файл лавочки использует clang (вместо g++) для компиляции и связывания и устанавливает правильную rpath для созданной общей библиотеки, поэтому вам не нужно будет экспортировать путь к библиотеке каждый раз, когда вы захотите использовать свою привязку!

Для получения дополнительной информации this article может быть вам полезна!

 Смежные вопросы

  • Нет связанных вопросов^_^