首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gyp链接c++节点外接程序时对v8的引用未定义

使用gyp链接c++节点外接程序时对v8的引用未定义
EN

Stack Overflow用户
提问于 2020-07-23 22:47:29
回答 1查看 232关注 0票数 1

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

这是我的binding.gyp文件:

代码语言:javascript
复制
    "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:

代码语言:javascript
复制
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++文件非常简单,它尽可能简单,因为我只想让它正确地构建和链接库:

代码语言:javascript
复制
#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时不能正确链接,我将非常感谢你的帮助。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-08-03 19:06:29

那么,你为什么不静态地链接OpenCV呢,它是在Apache许可下授权的。Apache许可对链接没有任何限制

代码语言:javascript
复制
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静态链接。

代码语言:javascript
复制
{
    "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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63057009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档