Как использовать/связать мезон для сборки Gstreamer в пакете ROS?

Чтобы использовать последнюю версию Gstreamer, я создал новую версию со следующими командами.

meson --prefix=/media/jai/Entertainment/Software/gstreamer/gst-build-installed --reconfigure build/  
ninja -C build/  
meson install -C build/

Теперь у меня есть этот каталог введите здесь описание изображения

И у него есть pkg-configs также введите здесь описание изображения

Какие изменения мне нужно внести в Cmakelist.txt и package.xml, чтобы связать этот Gstreamer?

Я пробовал ниже изменения. Но пока не повезло.

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(mypkg)

find_package(catkin REQUIRED COMPONENTS
    roscpp
    sensor_msgs
    std_msgs
    )

SET(ENV{PKG_CONFIG_PATH} "/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu/pkgconfig" $ENV{PKG_CONFIG_PATH})
SET(ENV{LD_LIBRARY_PATH} "/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu" $ENV{LD_LIBRARY_PATH})
find_package(PkgConfig REQUIRED)
pkg_check_modules(GST1.0 REQUIRED gstreamer-1.0)

find_package(Boost REQUIRED COMPONENTS thread)

catkin_package(
    CATKIN_DEPENDS roscpp sensor_msgs std_msgs
    DEPENDS Boost GST1.0
    INCLUDE_DIRS include
    LIBRARIES mypkg
    )

include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${GST1.0_INCLUDE_DIRS})

add_executable(mypkg src/main.cpp)

add_dependencies(mypkg ${catkin_EXPORTED_TARGETS})

target_link_libraries(mypkg ${catkin_LIBRARIES} ${GST1.0_LIBRARIES} ${Boost_LIBRARIES})

install(TARGETS mypkg
   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

install(DIRECTORY launch
   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

package.xml

<?xml version="1.0"?>
<package format="2">
<name>mypkg</name>
<version>0.1.0</version>
<description>Description</description>

<maintainer email="[email protected]">jai</maintainer>

<license>Apache 2.0</license>

<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>pkg-config</build_depend>

<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<build_export_depend>sensor_msgs</build_export_depend>
<build_export_depend>boost</build_export_depend>

<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>sensor_msgs</exec_depend>
<exec_depend>pkg-config</exec_depend>

<export>

</export>
</package>

main.cpp

#include "ros/ros.h"
#include <sensor_msgs/CompressedImage.h>
#include "thread"
#include <boost/thread.hpp>
extern "C"{
#include <gst/gst.h>
#include <gst/app/gstappsink.h>
}
int main(int argc, char **argv)
{
    ros::init(argc, argv, "gstreamer");
    gst_init(&argc, &argv);
    g_print ("**\nGstreamer version: %s\n**\n", gst_version_string ());

    ros::spin();
}

После всех вышеуказанных изменений пакет по-прежнему использует стандартный gstreamer вместо нового. ВЫВОД: jai@jai:~$ rosrun gstreamer gstreamer

************************************
Gstreamer version: GStreamer 1.8.3
************************************
libva info: VA-API version 0.39.4
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0

Я думаю, что он может получить доступ к включаемым файлам, но не к LIBS.


person Jai    schedule 30.12.2019    source источник


Ответы (1)


Я думаю, вам нужно использовать : (двоеточие) для разделения путей при настройке PKG_CONFIG_PATH и помнить о кавычках:

SET(ENV{PKG_CONFIG_PATH} "/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu/pkgconfig:$ENV{PKG_CONFIG_PATH}")

Вы также можете перепроверить версию gstreamer с помощью:

pkg_get_variable(GST_VERSION gstreamer-1.0 version)
message(STATUS "Gstreamer version:${GST_VERSION}")

Обратите внимание, что ваше приложение должно иметь возможность находить созданные вами библиотеки gstreamer во время выполнения. Чтобы это стало возможным, они должны быть установлены в известные места из LD_LIBRARY_PATH. Обновление этого, как отметил @Florian, также возможно для целей разработки, а также с использованием конфигурации компоновщика среды выполнения /etc/ld.so.config.

PS

Я заметил gstappsink.h и задаюсь вопросом, не пропустили ли вы другие gst-пакеты в своих cmakelists, например. gstreamer-приложение-1.0. Проверьте макрос cmake find_gstreamer_component

Под редакцией Джая.

gedit .bashrc

export LD_LIBRARY_PATH=/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
person pmod    schedule 30.12.2019
comment
Спасибо за ваш ответ. SET(ENV{PKG_CONFIG_PATH} "/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu/pkgconfig:$ENV{PKG_CONFIG_PATH}") и SET(ENV{PKG_CONFIG_PATH} "/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu/pkgconfig" $ENV{PKG_CONFIG_PATH}). Оба результата одинаковы с pkg_get_variable(GST_VERSION gstreamer-1.0 version) - 1.17.0.1 (новый gstreamer). В моей среде IDE, если я наведу курсор на строку #include <gst/gst.h>, он отобразит новый путь к заголовку gstreamer, но gst_version_string() по-прежнему выдает старую версию gstreamer во время выполнения. - person Jai; 31.12.2019
comment
То есть во время выполнения. Это отличается от строительства. Попробуйте использовать LD_LIBRARY_PATH, чтобы указать на ваши новые библиотеки GStreamer. Затем они должны загружаться вместо общесистемных доступных. - person Florian Zwoch; 31.12.2019
comment
@ФлорианЗвох. Я редактировал LD_LIBRARY_PATH в CMakeLists.txt. Тем не менее новый gstreamer (1.17) не связан. Я обновил свой вопрос полными CMakeLists.txt, Package.xml и main.cpp - person Jai; 31.12.2019
comment
Правильно, Флориан говорит о привязке во время выполнения, а не во время сборки, поэтому речь идет не о файле cmake. Ваше приложение должно иметь возможность находить правильные *.so (соответствующие заголовкам, для которых оно было создано) при запуске. - person pmod; 01.01.2020
comment
@FlorianZwoch, спасибо. Я gedit .bashrc и добавил export LD_LIBRARY_PATH=/media/jai/Entertainment/Software/gstreamer/gst-build-installed/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH. Его связь с новым gstreamer. - person Jai; 01.01.2020