有人看到我的绑定文件有什么问题吗?
是的:
"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
中遵循了这个建议。因此,在您的源代码中,您将编写例如:
而不是:
稍后
现在你的编译器无法找到<gst/gstconfig.h>
可能的原因之一是您没有忠实地复制您的系统报告的必要包含目录:
pkg-config --cflags gstreamer-1.0
将你的目录添加到
binding-gyp
的
include_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
中。
-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
- user7860670include_dirs
的gyp文件部分,库目录放入library_dirs
部分吗? - user7860670