Я работаю над проектом, который использует камеру глубины стереоаппарата 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.
Запустить 'npm install --verbose', чтобы просмотреть полный журнал. Кажется, что узел не может найти компиляцию, а не 'bin/sh', у вас должна быть строка'/usr/bin/g ++ '. –
Да, @Yan Foto, вы правы. Это моя ошибка, чтобы экспортировать CXX = '- std = C++ 11' (узел сказал мне, что эта сборка требует флага -std = C++ 11 для компиляции), это должен быть экспорт CXX = 'g ++ -std = C++ 11' . Я был введен в заблуждение другой статьей, которую я прочитал ранее. Проблема решена. – j0e1in