将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

