javascript — node-gyp — не найдены заголовки библиотек

Я пытаюсь использовать инфраструктуру gstreamer в аддоне моего узла. У меня было следующее для моего привязки .gyp, но когда я запускаю команду сборки, консоль заявляет, что заголовок не найден. Когда я компилирую свои файлы gstreamer за пределами node-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
введите описание изображения здесь

7

Решение

Кто-нибудь видит что-то не так с моим файлом привязки?

Да:

"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, (В вашей системе это может отличаться от моего):

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" ]
}
]
}

(Мы забыли -pthread Опция выбрасывается pkg-config? Нет. node-gyp проходит
это компилятор и компоновщик по умолчанию)

С этим binding.gypВаша сборка должна выглядеть примерно так:

$ node-gyp configure build
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | 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 говорит вам, что правильный компилятор include-путь
найти заголовочные файлы 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>

Одной из возможных причин является то, что вы не копировали правдиво
необходимые каталоги include для ваш система по:

pkg-config --cflags gstreamer-1.0

в 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

был запущен на 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

мы получаем дополнительный каталог 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 Информация. Чтобы обойти это, попросите менеджера пакетов вашего дистрибутива показать вам
где действительно установлен пакет 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

Затем добавьте требуемый префикс пути (например, /usr/lib/x86_64-linux-gnu/gstreamer-1.0/include)
к include_dirs вашей binding.gyp,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]