gpt4 book ai didi

javascript - node-gyp - 找不到库头文件

转载 作者:可可西里 更新时间:2023-11-01 18:38:17 25 4
gpt4 key购买 nike

我正在尝试在我的 Node 插件中使用 gstreamer 框架。我的 binding.gyp 有以下内容,但是当我运行构建命令时,控制台指出未找到 header 。当我在 node-gyp 之外编译我的 gstreamer 文件时,它编译成功。有人看到我的绑定(bind)文件有问题吗?

控制台

hello.cc3:25: fatal error: gstreamermm.h: No such file or directory 

绑定(bind).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 enter image description here

最佳答案

Does anyone see something wrong with my binding file?

是的:

"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 . (在你的系统上它可能与我的不同):

绑定(bind).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你的 list 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

在 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开发包有缺陷 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

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

关于javascript - node-gyp - 找不到库头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46027121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com