node-gyp - 找不到库头

AJ_*_*AJ_ 7 javascript c++ node.js gyp node-gyp

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

安慰

hello.cc3:25: fatal error: gstreamermm.h: No such file or directory 
Run Code Online (Sandbox Code Playgroud)

binding.gyp

{
  "targets": [
    {
      "target_name": "addon",
          "libraries": [
            "-lgstreamer-1.0", "-L/usr/inlcude/gstreamer-1.0/gst/"
          ],
      "sources": [ "hello.cc" ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

g++ main.c -o main `pkg-config --cflags --libs gstreamer-1.0`
Run Code Online (Sandbox Code Playgroud)

更新:关注@Mike Kinghan binding.gyp 在此输入图像描述

Mik*_*han 6

有人发现我的绑定文件有问题吗?

是的:

"libraries": [
            "-lgstreamer-1.0", "-L/usr/include/gstreamer-1.0/gst/"
          ],
Run Code Online (Sandbox Code Playgroud)

"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/",
]
Run Code Online (Sandbox Code Playgroud)

但是您不需要它,因为/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`
Run Code Online (Sandbox Code Playgroud)

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

pkg-config --cflags --libs gstreamer-1.0
Run Code Online (Sandbox Code Playgroud)

输出构建依赖于的目标所需的编译器和链接器选项 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
Run Code Online (Sandbox Code Playgroud)

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

绑定.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" ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

(我们是否忘记了-pthread由 发出的选项pkg-confignode-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 
Run Code Online (Sandbox Code Playgroud)

此外,请注意,pkg-config告诉您用于定位 gstreamer-1.0 头文件的正确编译器包含路径是:

/usr/include/gstreamer-1.0
Run Code Online (Sandbox Code Playgroud)

不是:

/usr/incude/gstreamer-1.0/gst/
Run Code Online (Sandbox Code Playgroud)

我们在我们的binding.gyp. 因此,在您的源代码中,您将编写,例如

#include <gst/gst.h>
Run Code Online (Sandbox Code Playgroud)

并不是:

#include <gst.h>
Run Code Online (Sandbox Code Playgroud)

之后

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

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

pkg-config --cflags gstreamer-1.0
Run Code Online (Sandbox Code Playgroud)

进入include_dirs您的binding-gyp. 可能你只是从我的例子中复制了那些。我的例子,给出目录:

-I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 17.04 上运行gst/gstconfig.h,实际上安装在/usr/include/gstreamer-1.0. 但是在 Ubuntu 16.04 上,例如:-

$ 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
Run Code Online (Sandbox Code Playgroud)

我们得到额外的包含目录:

/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include
Run Code Online (Sandbox Code Playgroud)

并且gst/gstconfig.h确实安装在那里。检查您使用的包含pkg-config系统报告的目录是否正确,并binding.gyp在必要时更正您的目录。

如果您使用正确的pkg-config结果,那么它会出现你的 gstreamer-1.0dev软件包有缺陷的gstreamer-1.0.pc文件提供不正确 pkg-config的信息。要解决这个问题,请让您的发行版的包管理器向您显示 dev 包的真正安装位置gst/gstconfig.h。例如对于 Ubuntu 16.04:

$ dpkg -L libgstreamer1.0-dev | grep gst/gstconfig
/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include/gst/gstconfig.h
Run Code Online (Sandbox Code Playgroud)

然后将所需的路径前缀(例如/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include)添加到include_dirs您的binding.gyp.