node-gyp - 找不到库头

时间:2017-09-03 19:28:46

标签: javascript c++ node.js node-gyp gyp

我试图在我的节点插件中使用gstreamer框架。我对我的binding.gyp有以下内容,但是当我运行build命令时,控制台声明找不到标题。当我在node-gyp之外编译我的gstreamer文件时,它成功编译。有没有人看到我的绑定文件有问题?

控制台

{
  "targets": [
    {
      "target_name": "addon",
          "libraries": [
            "-lgstreamer-1.0", "-L/usr/inlcude/gstreamer-1.0/gst/"
          ],
      "sources": [ "hello.cc" ]
    }
  ]
}

binding.gyp

g++ main.c -o main `pkg-config --cflags --libs gstreamer-1.0`

编译命令正常工作,我试图运行

RootObject

更新: 关注@Mike Kinghan binding.gyp enter image description here

1 个答案:

答案 0 :(得分:3)

  

有人看到我的绑定文件有问题吗?

是:

"libraries": [
            "-lgstreamer-1.0", "-L/usr/include/gstreamer-1.0/gst/"
          ],

"libraries"中的binding.gyp元素应包含-l中指定的库或 绝对文件名表单,您要链接。

-lgstreamer-1.0就是其中之一。 -L/usr/inlcude/gstreamer-1.0/gst/ 不是。它是一个链接器选项,用于指示链接器进行搜索 对于-l目录中/usr/include/gstreamer-1.0/gst/表单中指定的库。

那是指定一个库搜索目录,所以如果需要,你应该这样说 "library_dirs"元素:

"library_dirs": [
  "/usr/inlcude/gstreamer-1.0/gst/",
]

但你不需要它,因为/usr/inlcude/gstreamer-1.0/gst/中没有库。 /usr/include下的所有文件都是C或C ++头文件,而不是库。图书馆 安装在/lib/usr/lib/usr/local/lib下。

您说您可以使用以下命令成功编译程序:

g++ main.c -o main `pkg-config --cflags --libs gstreamer-1.0`

这是有效的,因为你可能知道,

pkg-config --cflags --libs gstreamer-1.0

输出构建依赖的目标所需的编译器和链接器选项 gstreamer-1.0

我们来看看:

$ pkg-config --cflags --libs gstreamer-1.0
-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include \
-lgstreamer-1.0 -lgobject-2.0 -lglib-2.0

然后让我们使用该信息来编写binding.gyp。 (在您的系统上它可能与我的不同):

<强> binding.gyp

{
    "targets": [
    {
        "target_name": "addon",
        "include_dirs": [
            "/usr/include/gstreamer-1.0",
            "/usr/include/glib-2.0",
            "/usr/lib/x86_64-linux-gnu/glib-2.0/include"
        ],
        "libraries": [
            "-lgstreamer-1.0",
            "-lgobject-2.0",
            "-lglib-2.0"
        ],
        "sources": [ "hello.cc" ]
    }
  ]
}

(我们忘记了-pthread发出的pkg-config选项吗?没有node-gyp次通过 它默认是编译器和链接器)

使用此binding.gyp,您的构建应该看起来像我的:

$ node-gyp configure build
gyp info it worked if it ends with ok
gyp info using node-gyp@3.4.0
gyp info using node@4.7.2 | linux | x64
gyp info spawn /usr/bin/python2
gyp info spawn args [ '/usr/share/node-gyp/gyp/gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'make',
gyp info spawn args   '-I',
gyp info spawn args   '/home/imk/develop/so/scrap/build/config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/usr/share/node-gyp/addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   '/usr/include/nodejs/common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=/usr/include/nodejs',
gyp info spawn args   '-Dnode_gyp_dir=/usr/share/node-gyp',
gyp info spawn args   '-Dnode_lib_file=node.lib',
gyp info spawn args   '-Dmodule_root_dir=/home/imk/develop/so/scrap',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--no-parallel',
gyp info spawn args   '--generator-output',
gyp info spawn args   'build',
gyp info spawn args   '-Goutput_dir=.' ]
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory '/home/imk/develop/so/scrap/build'
  CXX(target) Release/obj.target/addon/hello.o
  SOLINK_MODULE(target) Release/obj.target/addon.node
  COPY Release/addon.node
make: Leaving directory '/home/imk/develop/so/scrap/build'
gyp info ok 

此外,pkg-config告诉您正确的编译器包含路径 找到gstreamer-1.0头文件是:

/usr/include/gstreamer-1.0

/usr/incude/gstreamer-1.0/gst/

我们在binding.gyp中遵循了这个建议。因此 在您的源代码中,您将编写,例如

#include <gst/gst.h>

而不是:

#include <gst.h>

<强>后来

现在你的编译器无法找到<gst/gstconfig.h>

一个可能的原因是你没有忠实地复制 通过以下方式为您的系统报告的必要包含目录:

pkg-config --cflags gstreamer-1.0

进入include_dirs的{​​{1}}列表。可能是你 刚从我的例子中复制了那些。我的例子,给出目录:

binding-gyp

在Ubuntu 17.04上运行,实际上-I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 \ -I/usr/lib/x86_64-linux-gnu/glib-2.0/include 安装在gst/gstconfig.h。但在Ubuntu 16.04上, 例如: -

/usr/include/gstreamer-1.0

我们获得了额外的include目录:

$ pkg-config --cflags gstreamer-1.0
-pthread -I/usr/include/gstreamer-1.0 \
-I/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include -I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include
确实安装了

/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include 。检查您是否正在使用 正确包含gst/gstconfig.h在您的系统上报告的目录 如有必要,请更正pkg-config

如果你 使用了正确的binding.gyp结果,那么它似乎就是你的 pkg-config dev包有错误的gstreamer-1.0文件提供错误 gstreamer-1.0.pc信息。要解决这个问题,请让发行包的经理向您展示 dev软件包真正安装在哪里pkg-config。例如。对于Ubuntu 16.04:

gst/gstconfig.h

然后添加所需的路径前缀(例如$ dpkg -L libgstreamer1.0-dev | grep gst/gstconfig /usr/lib/x86_64-linux-gnu/gstreamer-1.0/include/gst/gstconfig.h ) 到/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include的{​​{1}}。