使用gyp链接c++节点插件时,未定义对v8的引用



我正在尝试使用opencv库构建一个节点插件。我正在使用node-gyp编译它。我已经使用binding.gyp配置文件链接了opencv,但我在v8库中遇到了一些问题。

这是我的binding.gyp文件:

"targets": [
{
"target_name": "test",
"sources": [ "src/native/test.cpp" ],
"include_dirs": [
"/usr/local/include/opencv4",
"/usr/local/include/node",
"/usr/include"
],
"library_dirs": [ "/usr/local/lib", "/usr/lib" ],
"libraries": [
"/usr/local/lib/libopencv_core.so",
"/usr/local/lib/libopencv_videoio.so",
"/usr/local/lib/libopencv_highgui.so",
"/usr/lib/libv8.so"
],
"ldflags": [ "-Wl,-z,defs" ],
"link_settings": {
"libraries": [
"-lopencv_core",
"-lopencv_videoio",
"-lopencv_highgui",
"-lv8",
"-lpthread"
]
}
}
]
}

在没有链接opencv的情况下,我没有任何问题来构建和运行我的插件,但一旦我链接了opencv,构建就失败了,因为v8:

test.cpp:(.text+0x1f9): undefined reference to `v8::V8::ToLocalEmpty()'
test.cpp:(.text+0x209): undefined reference to `v8::V8::FromJustIsNothing()'
test.cpp:(.text+0x219): undefined reference to `v8::V8::ToLocalEmpty()'
test.cpp:(.text+0x229): undefined reference to `v8::V8::ToLocalEmpty()'
test.cpp:(.text+0x239): undefined reference to `v8::V8::FromJustIsNothing()'
... and so on

正如您在binding.gyp文件中所看到的,我已经尝试链接相应的库并包含v8,但它没有成功。

我很确定这是一个问题或与配置本身冲突,因为在没有链接opencv的情况下,构建效果很好,在nodeJS文件中使用插件也没有问题。

我的c++文件非常简单,它尽可能简单,因为我只想让它正确地构建和链接库:

#include <opencv4/opencv2/core.hpp>
#include <opencv4/opencv2/videoio.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <node/v8.h>
#include <node/node.h>
#include <iostream>
#include <stdio.h>
void capture(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope scope(isolate);
cv::Mat frame;
cv::VideoCapture cap;
}
void Initialize(v8::Local<v8::Object> exports) {
NODE_SET_METHOD(exports, "capture", capture);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)

如果你对这个构建错误有任何想法,以及为什么v8在链接opencv时没有正确链接,我将感谢任何帮助,

感谢

好吧,为什么不静态链接OpenCV呢?它是根据Apache许可证授权的。Apache许可证对链接没有任何限制

rm -rf 3rdparty/opencv
mkdir -p 3rdparty/opencv
rm -rf tmp
mkdir tmp
cd tmp
rm -rf opencv-master
rm -rf opencv_contrib-master
git clone --branch 3.4 --depth 1 https://github.com/opencv/opencv.git opencv-master
git clone --branch 3.4 --depth 1 https://github.com/opencv/opencv_contrib.git opencv_contrib-master
mkdir build
cd build
cmake 
-DCMAKE_INSTALL_PREFIX="$(pwd)/../../3rdparty/opencv@3.4" 
-DBUILD_SHARED_LIBS=OFF 
-DENABLE_PRECOMPILED_HEADERS=YES 
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-master/modules 
../opencv-master
cmake --build .
make install

我创建了一个简单的脚本,它将使用OpenCV_contrib(SIFT,SURF可用(编译OpenCV 3.4,用于静态链接Node.js的Native Abstractions。

{
"targets": [
{
"target_name": "addon",
"cflags": [
"-std=c++11",
"-stdlib=libc++"
],
"cflags_cc!": [
"-fno-rtti",
"-fno-exceptions"
],
"xcode_settings": {
"GCC_ENABLE_CPP_RTTI": "YES",
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
},
"include_dirs": [
"../../3rdparty/opencv/@3.4/include",
"<!(node -e "require('nan')")"
],
'libraries': [
"<!@(node utils/find-libs.js)",
"-framework OpenCL"
],
"sources": [
"./src/main.cc",
"./src/lib/MainAddon.cc"
],
}
]
}

完整的源代码足够大,所以它发布在这个GitHub存储库中

最新更新