CMake успешен, но make терпит неудачу при соединении - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь скомпилировать мой проект на macOS с CMake. У меня установлен gstreamer через brew, и я могу получить доступ к каталогу include. Например, это директива включения для gstreamer:

/usr/local/Cellar/gstreamer/1.16.2/include/gstreamer-1.0/

При запуске cmake со следующими CMakeLists.txt все работает успешно, но make не удается, когда я пытаюсь связать со следующей ошибкой:

[ 25%] Linking CXX executable multiviewer
ld: library not found for -lgstreamer-1.0

CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(application)

set(CMAKE_CXX_STANDARD 20)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt5Core REQUIRED)
find_package(Qt5Quick REQUIRED)
find_package(Qt5WebSockets REQUIRED)

# Required for GStreamer
find_package(PkgConfig)

# Look for GStreamer installation
pkg_check_modules(GST REQUIRED gstreamer-1.0)

add_executable(application
        main.cpp qml.qrc server.cpp server.h
        ${PROTO_SRCS} ${PROTO_HDRS} client.cpp client.h)

# Qt5
target_link_libraries(application Qt5::Core Qt5::Quick Qt5::WebSockets)

# GStreamer
target_include_directories(application PUBLIC ${GST_INCLUDE_DIRS})
target_compile_options(application PUBLIC ${GST_CFLAGS})
target_link_libraries(application ${GST_LIBRARIES})

Вот пакеты, которые я установил:

brew install pkg-config
brew install gstreamer
brew install gst-plugins-base
brew install gst-plugins-good
brew install gst-plugins-bad
brew install gst-plugins-ugly
brew install gst-libav

Вывод pkg-config --cflags gstreamer-1.0:

-I/usr/local/Cellar/libffi/3.2.1/lib/libffi-3.2.1/include -I/usr/local/Cellar/gstreamer/1.16.2/include/gstreamer-1.0 -I/usr/local/Cellar/glib/2.62.4/include -I/usr/local/Cellar/glib/2.62.4/include/glib-2.0 -I/usr/local/Cellar/glib/2.62.4/lib/glib-2.0/include -I/usr/local/opt/gettext/include -I/usr/local/Cellar/pcre/8.43/include

Вывод pkg-config --libs gstreamer-1.0:

-L/usr/local/Cellar/gstreamer/1.16.2/lib -L/usr/local/Cellar/glib/2.62.4/lib -L/usr/local/opt/gettext/lib -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lintl

Нужно ли что-то еще для установки или что я делаю не так?

1 Ответ

1 голос
/ 29 января 2020

Ошибка:

ld: library not found for -lgstreamer-1.0

указывает, что библиотека gstreamer-1.0 была передана компоновщику, но компоновщик не знает, где ее найти (вероятно, потому что она не находится в типичной системе пути). Именно CMake предоставляет полный путь к библиотекам GST. Из документации pkg_check_modules приведены некоторые относящиеся к библиотеке переменные, заполненные для универсального c пакета XXX:

  • <XXX>_LIBRARIES: только библиотеки (без '-l')

  • <XXX>_LINK_LIBRARIES: библиотеки и их абсолютные пути

  • <XXX>_LIBRARY_DIRS: пути к библиотекам (без '-L')

Переменная GST_LIBRARIES будет содержать только имена библиотек (gstreamer-1.0;gobject-2.0;glib-2.0;intl), но в этом В этом случае нам также необходимо указать пути к библиотекам. Итак, измените target_link_libraries() на использование GST_LINK_LIBRARIES:

target_link_libraries(application PUBLIC ${GST_LINK_LIBRARIES})
...