You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Qmake项目移植到CMake时,交叉编译GStreamer到外部板卡遇问题求助

Qmake转CMake跨编译GStreamer失败问题解决

问题背景

将Qmake项目移植到CMake后,本地编译部署正常,但交叉编译部署到外部Linux板卡时出现路径错误与头文件缺失问题:

error: WARNING: unsafe header/library path used in cross-compilation: '-I/usr/include/gstreamer-1.0'
error: WARNING: unsafe header/library path used in cross-compilation: '-I/usr/include/glib-2.0'
error: WARNING: unsafe header/library path used in cross-compilation: '-I/usr/lib/glib-2.0/include'
error: glibconfig.h: No such file or directory
error: ninja: build stopped: subcommand failed.

原Qmake代码

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
HEADERS += \
    $$PWD/QmlVideoPlayer.hpp
SOURCES += \
    $$PWD/private/QmlVideoPlayer.cpp
unix: CONFIG += link_pkgconfig
unix: PKGCONFIG += gstreamer-1.0
unix: PKGCONFIG += gstreamer-video-1.0

原CMake代码

find_package(PkgConfig REQUIRED)
find_package(Qt5 COMPONENTS Core Gui Quick Widgets REQUIRED)
if(NOT PKG_CONFIG_FOUND)
  message(FATAL_ERROR "pkg-config not found!" )
endif()
pkg_check_modules(GST REQUIRED gstreamer-1.0 gstreamer-video-1.0)
include_directories(${GST_INCLUDE_DIRS})
link_directories(${GST_LIBRARY_DIRS})
add_definitions(${GST_CFLAGS_OTHER})
add_library(qmlvideoplayer
    QmlVideoPlayer.hpp
    private/QmlVideoPlayer.cpp
)
target_link_libraries(qmlvideoplayer
    PRIVATE Qt5::Core Qt5::Gui Qt5::Quick Qt5::Widgets
    PUBLIC ${GST_LIBRARIES})

外部板卡相关路径

root@test:/usr/share# ls
alsa              fontconfig        gst-plugins-base  sounds
dhcpcd            fonts             gstreamer-1.0     terminfo
drirc.d           gettext           icons             udhcpc
ffmpeg            glib-2.0          locale            xml

解决方案

1. 配置交叉编译环境的pkg-config

交叉编译时pkg-config默认读取本地主机的库路径,导致引用不安全的/usr路径。需指定目标板卡的根文件系统路径,强制pkg-config从目标环境查找依赖:

  • 设置目标板卡sysroot路径:
    export PKG_CONFIG_SYSROOT_DIR=/path/to/your/board/sysroot
    
  • 指定pkg-config配置文件搜索路径:
    export PKG_CONFIG_PATH=${PKG_CONFIG_SYSROOT_DIR}/usr/lib/pkgconfig:${PKG_CONFIG_SYSROOT_DIR}/usr/share/pkgconfig
    
    替换/path/to/your/board/sysroot为实际的板卡根文件系统路径。

2. 优化CMake代码,使用导入目标

原CMake的全局路径设置不够规范,改用IMPORTED_TARGET让CMake自动处理依赖的路径与编译选项,适配交叉编译场景:

find_package(PkgConfig REQUIRED)
find_package(Qt5 COMPONENTS Core Gui Quick Widgets REQUIRED)

# 使用IMPORTED_TARGET自动管理GST的依赖配置
pkg_check_modules(GST REQUIRED IMPORTED_TARGET gstreamer-1.0 gstreamer-video-1.0)

add_library(qmlvideoplayer
    QmlVideoPlayer.hpp
    private/QmlVideoPlayer.cpp
)

target_link_libraries(qmlvideoplayer
    PRIVATE Qt5::Core Qt5::Gui Qt5::Quick Qt5::Widgets
    PUBLIC PkgConfig::GST
)

此方式无需手动调用include_directories、link_directories和add_definitions,避免全局路径污染,确保交叉编译时使用目标系统的依赖路径。

3. 确认目标板卡的依赖完整性

检查板卡根文件系统是否包含完整的开发依赖:

  • 确认${PKG_CONFIG_SYSROOT_DIR}/usr/lib/pkgconfig下存在gstreamer-1.0.pc和gstreamer-video-1.0.pc文件
  • 确认${PKG_CONFIG_SYSROOT_DIR}/usr/include下有完整的glib-2.0和gstreamer-1.0头文件,尤其是glibconfig.h(通常位于/usr/lib/glib-2.0/include)
    若缺少这些文件,需将对应的开发包安装到板卡的根文件系统中。

内容的提问来源于stack exchange,提问作者mungimatte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:23:29