Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有C+的节点应用程序+;插件在运行时抱怨未定义的符号_C++_Node.js_Opencv_Node Gyp - Fatal编程技术网

C++ 带有C+的节点应用程序+;插件在运行时抱怨未定义的符号

C++ 带有C+的节点应用程序+;插件在运行时抱怨未定义的符号,c++,node.js,opencv,node-gyp,C++,Node.js,Opencv,Node Gyp,我有一个NodeJS应用程序,它对实现一些OpenCV调用的本机插件进行一些调用。node-gyp-build命令成功,但每次我尝试使用node-app运行服务器时,我都会得到: Error: /home/cmaccess/SfMLocalization/VisionLocalizeServer/build/Release/localizeImage.node: undefined symbol: _ZNK2cv9Feature2D5emptyEv at Module.load (mod

我有一个NodeJS应用程序,它对实现一些OpenCV调用的本机插件进行一些调用。
node-gyp-build
命令成功,但每次我尝试使用
node-app运行服务器时,我都会得到:

Error: /home/cmaccess/SfMLocalization/VisionLocalizeServer/build/Release/localizeImage.node: undefined symbol: _ZNK2cv9Feature2D5emptyEv
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at bindings (/home/cmaccess/SfMLocalization/VisionLocalizeServer/node_modules/bindings/bindings.js:76:44)
    at Object.<anonymous> (/home/cmaccess/SfMLocalization/VisionLocalizeServer/routes/localize.js:28:37)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
错误:/home/cmaccess/SfMLocalization/VisionLocalizeServer/build/Release/localizeImage.node:未定义的符号:_ZNK2cv9Feature2D5emptyEv
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
at Module.require(Module.js:364:17)
根据需要(模块js:380:17)
在绑定时(/home/cmaccess/SfMLocalization/VisionLocalizeServer/node_modules/bindings/bindings.js:76:44)
反对。(/home/cmaccess/SfMLocalization/VisionLocalizeServer/routes/localize.js:28:37)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)

就我个人而言,我无法理解为什么会发生这种情况。我签出了一个已知的好版本,并重新安装了OpenCV。我甚至没有在任何代码中明确使用
cv::Feature2D
!是否有人对可能导致此未定义符号错误的原因提出建议?

在链接库并随后尝试加载时,有几件事需要检查。例如,在Linux中,所有符号只需要在最后加载阶段(加载可执行文件)才可用,而node则是在运行node并加载本机插件时可用。若要在缺少符号时强制节点加载项生成失败,必须在节点gyp中将
-z defs
作为链接器选项传递。因此,您可以将binding.gyp中的以下内容添加到“link_settings”元素或适当的位置:

"ldflags": [
            "-Wl,-z,defs"
        ]
如果您不知道如何编辑建筑和链接,请查看节点gyp教程(类似)

注意:节点似乎也延迟了其许多内部构件的符号加载,因此不幸的是,您也将获得大量未定义的v8符号。这可能是不可避免的,因为节点动态加载这些符号。您必须检查输出并将其传输到寻呼机或grep,以查找opencv缺少的符号。在这个阶段,这些名称将不会被损坏。完成后,删除这些标志

如果您在此处遇到opencv未定义错误,则表示您链接库不正确或根本没有链接。需要注意的是:

  • 如果在某个“libraries”元素中有所有的-lopencv_*library链接标志,如果没有,则实际上并没有链接opencv,但如果没有
    -z defs
    ,它通常不会抱怨
  • 如果它正在链接与您正在使用的标题对应的库(避免此类问题的最简单方法就是使用发行版的opencv)。如果需要在binding.gyp中使用签出版本的opencv,可以通过为include和library搜索路径设置构建标志来明确这些内容
您可以使用nm查看在最终节点加载项中定义的符号。。。任何带有“U”(未定义)的部件都将在最终加载阶段可用。除非静态链接opencv,否则仍应将opencv符号视为未定义。所谓:

$ nm -C myaddon.node
C将对名称进行demangle,如果链接了共享库,则应将cv::Feature2D视为未定义。最后一步是检查加载库时将加载哪些库。使用ldd来执行此操作

$ ldd myaddon.node
这将向您显示任何找不到的库。如果在此处未找到opencv库,则您尚未链接共享库。如果确实找到了库,它还将向您显示它在哪里找到库(您可以使用这些路径来确保您正在使用签出的库)

只是最后一个核心选项,opencv似乎有很多库,最好的办法是链接所有库以解决缺少的符号。使用pkgconfig获取所有LIB:

$ pkg-config --libs opencv
您可以使用获取包含标志

$ pkg-config --cflags opencv

将这些内容放在binding.gyp中的适当位置。

我遇到了与此类似的问题,我的opencv安装不好(?)。重新安装解决了问题。

发现,如果“#include something.h”中包含了某些内容,则编译将正常,但如果我使用(在我的情况下)一些新实例,如“new something()”,则会显示“未定义的符号”。因此,我应该在源代码部分的binding.gyp中包含“something.cpp”:

"sources": [ "something.cpp" ]

谢谢你的评论!我最终发现了问题所在。我以为我是针对安装在/opt/OpenCV中的OpenCV 3.0进行链接的,但由于include搜索路径中的路径顺序,它意外地链接到了/usr/local中的OpenCV 2.4。我花了很长时间才弄明白。你能提供有关环境的信息吗?系统等等?有人能回答我的问题吗?。如何添加符号?我尝试添加变量,但没有帮助。例如“CLSID\U SystemDeviceEnum”:“C:\Program Files(x86)\Windows Kits\10\Include\10.0.19041.0\shared\uuids.h”,