最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 4浏览 0评论

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

我有一个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)

我无法为自己的生活弄清为什么会这样。我签出了已知的良好修订版本,然后重新安装了OpenCV。我什至没有在任何代码中显式使用cv::Feature2D!是否有人对导致此未定义符号错误的原因有任何建议?

回答如下:

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

"ldflags": [
            "-Wl,-z,defs"
        ]

如果您不知道如何编辑建筑物和链接,请参阅node-gyp教程(类似this)。>

Note

:看来节点也推迟了很多内部符号的加载,因此不幸的是,您还将为v8东西获得很多未定义的符号。这可能是不可避免的,因为节点会动态加载这些符号。您将必须检查输出并将其通过管道传送到寻呼机或grep,以查找缺少opencv的符号。名称在此阶段将不会被修改。完成后,删除这些标志。

如果您在这里遇到opencv未定义的错误,则意味着您链接的库错误或根本没有链接。需要注意的一些事情是:

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

$ nm -C myaddon.node

-C将对名称进行解密,如果您链​​接共享库,则应将cv :: Feature2D视为未定义。最后一步是检查在加载库时将加载哪些库。使用ldd执行此操作。

$ ldd myaddon.node

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

只是最后一个核选项,opencv似乎有很多库,最好的办法是将所有库链接起来以解决丢失的符号。使用pkgconfig获取所有这些库:

$ pkg-config --libs opencv

您可以使用]获得包含标志>

$ pkg-config --cflags opencv

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

我有一个与此类似的问题,并且我的opencv安装错误(?)。重新安装它解决了问题。

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

我有一个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)

我无法为自己的生活弄清为什么会这样。我签出了已知的良好修订版本,然后重新安装了OpenCV。我什至没有在任何代码中显式使用cv::Feature2D!是否有人对导致此未定义符号错误的原因有任何建议?

回答如下:

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

"ldflags": [
            "-Wl,-z,defs"
        ]

如果您不知道如何编辑建筑物和链接,请参阅node-gyp教程(类似this)。>

Note

:看来节点也推迟了很多内部符号的加载,因此不幸的是,您还将为v8东西获得很多未定义的符号。这可能是不可避免的,因为节点会动态加载这些符号。您将必须检查输出并将其通过管道传送到寻呼机或grep,以查找缺少opencv的符号。名称在此阶段将不会被修改。完成后,删除这些标志。

如果您在这里遇到opencv未定义的错误,则意味着您链接的库错误或根本没有链接。需要注意的一些事情是:

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

$ nm -C myaddon.node

-C将对名称进行解密,如果您链​​接共享库,则应将cv :: Feature2D视为未定义。最后一步是检查在加载库时将加载哪些库。使用ldd执行此操作。

$ ldd myaddon.node

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

只是最后一个核选项,opencv似乎有很多库,最好的办法是将所有库链接起来以解决丢失的符号。使用pkgconfig获取所有这些库:

$ pkg-config --libs opencv

您可以使用]获得包含标志>

$ pkg-config --cflags opencv

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

我有一个与此类似的问题,并且我的opencv安装错误(?)。重新安装它解决了问题。

发布评论

评论列表 (0)

  1. 暂无评论