我正在尝试使用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链接相应的库和include,但是没有成功。
我很确定这是一个问题或者与配置本身的冲突,因为在没有链接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时不能正确链接,我将非常感谢你的帮助。
谢谢
发布于 2021-08-03 19:06:29
那么,你为什么不静态地链接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 3.4与opencv_contrib (SIFT,冲浪可用)与Native Abstractions for Node.js静态链接。
{
"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"
],
}
]
}完整的源代码足够大,所以它发布在this GitHub repository上
https://stackoverflow.com/questions/63057009
复制相似问题