node-gyp - 找不到库头文件

9
我正在尝试在我的node插件中使用gstreamer框架。我已经将以下内容添加到我的binding.gyp文件中,但当我运行构建命令时,控制台显示找不到头文件。当我在node-gyp之外编译我的gstreamer文件时,它可以成功编译。有人看到我的绑定文件有问题吗?
控制台
hello.cc3:25: fatal error: gstreamermm.h: No such file or directory 

binding.gyp

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

我有一个编译命令,它能够正常工作,并且我正在尝试运行它。

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

更新: 根据 @Mike Kinghan 的 binding.gyp,

在这里输入图片描述

1
-L is for setting library path, to set includes location you should use -I, so it should look like -I /usr/inlcude/gstreamer-1.0/gst - user7860670
@VTT,我把"i"改成"I"了,但错误仍然存在。 - AJ_
不应该包含目录放入include_dirs的gyp文件部分,库目录放入library_dirs部分吗? - user7860670
@VTT,抱歉,我不明白。你所说的library_dirs是什么意思? - AJ_
@VTT 你有例子吗? - AJ_
1个回答

7

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

是的:

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

binding.gyp文件的"libraries"元素中,应该包含你想要链接的库,可以使用-l或绝对文件名形式指定。
其中-lgstreamer-1.0就是其中之一。-L/usr/include/gstreamer-1.0/gst/不是一个库,而是链接器选项,它会指示链接器在目录/usr/include/gstreamer-1.0/gst/中查找以-l形式指定的库。
这是指定库搜索目录,如果需要,则应在"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" ]
    }
  ]
}

我们是否忘记了由pkg-config发出的-pthread选项?没有。 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

将你的目录添加到binding-gypinclude_dirs列表中。可能你只是复制了我的示例中的目录。我的示例给出了以下目录:
-I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 \
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include

本项目在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

我们获得了额外的包含目录:
/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include

确保你在正确使用pkg-config报告的包含目录,并根据需要更正binding.gyp,而且gst/gstconfig.h确实安装在那里。如果您正在使用正确的pkg-config结果,则似乎您的gstreamer-1.0 dev软件包具有缺陷的gstreamer-1.0.pc文件,提供了不正确的pkg-config信息。为解决此问题,请向您的发行版软件包管理器请求显示开发软件包实际安装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

然后,在你的 binding.gyp 中添加所需的路径前缀(例如:/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include)到 include_dirs 中。


我仍然遇到一些构建错误。我的库位置与你的相同。请参见更新的问题。有什么建议吗? - AJ_
@AJ_: 你能把这个项目复制到Github上吗?我想从这里开始,寻找一个好的起点。 - user2801184

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接