【问题标题】:CMake is successful, but make fails when linkingCMake成功,但是链接时make失败
【发布时间】:2020-01-29 19:01:07
【问题描述】:

我正在尝试使用 CMake 在 macOS 上编译我的项目。我通过 brew 安装了 gstreamer,我可以访问包含目录。例如,这是 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

我需要安装其他东西还是我做错了什么?

【问题讨论】:

  • GST_LIBRARIES 变量的内容是什么?似乎 GStreamer 库没有被链接。试试message("GST_LIBRARIES: ${GST_LIBRARIES}")
  • @squareskittles 输出为:GST_LIBRARIES: gstreamer-1.0;gobject-2.0;glib-2.0;intl
  • 好的,这个问题是编译器不知道库的完整路径。如果填充正确,使用 GST_LINK_LIBRARIES 变量可能会更好。
  • @squareskittles 谢谢!这就是解决方案。您可能想写一个答案,以便我可以为未来迷失的灵魂接受它

标签: macos makefile cmake homebrew gstreamer


【解决方案1】:

错误:

ld: library not found for -lgstreamer-1.0

表示库gstreamer-1.0 已传递给链接器,但链接器不知道在哪里找到它(可能是因为它不在典型的系统路径中)。由 CMake 提供 GST 库的完整路径。在pkg_check_modules 文档中,以下是为通用包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})

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 2016-12-30
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2011-11-13
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多