node-gyp – 找不到库标题

我正在尝试在我的节点插件中使用gstreamer框架。 我有以下我的我的binding.gyp,但是当我运行生成命令它,控制台指出找不到标题。 当我编译我的gstreamer文件之外的节点gyp,它编译成功。 有没有人看到我的绑定文件有什么问题?

安慰

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 在这里输入图像描述

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

是:

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

binding.gyp"libraries"元素应该包含您要链接的库(以-l或绝对文件名forms指定)。

-lgstreamer-1.0就是其中之一。 -L/usr/inlcude/gstreamer-1.0/gst/不是。 这是一个链接器选项,它将指示链接器search/usr/include/gstreamer-1.0/gst/目录中-l格式指定的库。

这是指定一个库search目录,所以如果需要的话,你应该在"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 

输出编译器和链接器选项来build立一个依赖于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 ,你的构build应该看起来像我的东西:

 $ 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告诉你,findgstreamer-1.0头文件的正确编译器include-path是:

 /usr/include/gstreamer-1.0 

不:

 /usr/incude/gstreamer-1.0/gst/ 

我们在binding.gyp遵循了这个build议。 因此,在你的源代码中,你会写,例如

 #include <gst/gst.h> 

并不是:

 #include <gst.h> 

后来

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

一个可能的原因是,你没有忠实地复制报告给你的系统的必要include目录:

 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 

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

如果您使用的是正确的pkg-config结果,那么看起来您的gstreamer-1.0 dev软件包有一个缺陷的gstreamer-1.0.pc文件,提供了不正确的pkg-config信息。 为了解决这个问题,可以请你的发行版软件包pipe理器向你展示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 

然后将所需的path前缀(例如/usr/lib/x86_64-linux-gnu/gstreamer-1.0/include )添加到binding.gypinclude_dirs