Linux下CMake编译Ultralight项目遇GStreamer/GLib未定义引用错误
编译Ultralight Linux项目时遇到GLib相关链接错误
编译Linux平台的Ultralight项目时,出现以下链接错误:
/usr/bin/ld: /mnt/e/Programming/C_C++/ultralight-sdk-latest-linux-x64/bin/libgstreamer-full-1.0.so: undefined reference to `g_time_zone_new_identifier' /usr/bin/ld: /mnt/e/Programming/C_C++/ultralight-sdk-latest-linux-x64/bin/libgstreamer-full-1.0.so: undefined reference to `g_memdup2'
当前使用的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.19.0) project(BlackBoard) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(CMAKE_SYSTEM_NAME MATCHES "Windows") set(ULTRALIGHT_SDK_DIR E:/Programming/C_C++/ultralight-sdk-latest-win-x64) elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") set(ULTRALIGHT_SDK_DIR /mnt/e/Programming/C_C++/ultralight-sdk-latest-linux-x64) endif() IF(CMAKE_SYSTEM_NAME MATCHES "Windows") add_executable(BlackBoard main.cpp) include_directories(${ULTRALIGHT_SDK_DIR}/include) link_directories(${ULTRALIGHT_SDK_DIR}/lib) target_link_libraries(BlackBoard ${ULTRALIGHT_SDK_DIR}/lib/Ultralight.lib) target_link_libraries(BlackBoard ${ULTRALIGHT_SDK_DIR}/lib/UltralightCore.lib) target_link_libraries(BlackBoard ${ULTRALIGHT_SDK_DIR}/lib/AppCore.lib) target_link_libraries(BlackBoard ${ULTRALIGHT_SDK_DIR}/lib/WebCore.lib) elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(GLIB REQUIRED glib-2.0) include_directories(${GLIB_INCLUDE_DIRS}) link_directories(${GLIB_LIBRARY_DIRS}) link_libraries(${GLIB_LIBRARIES}) link_libraries(X11) include_directories(${ULTRALIGHT_SDK_DIR}/include) link_directories(${ULTRALIGHT_SDK_DIR}/bin) link_libraries( UltralightCore AppCore Ultralight WebCore ) add_executable(BlackBoard main.cpp) else() message(STATUS ${CMAKE_SYSTEM_NAME}) endif() add_custom_command(TARGET BlackBoard POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${ULTRALIGHT_SDK_DIR}/bin" $<TARGET_FILE_DIR:BlackBoard>) add_custom_command(TARGET BlackBoard POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/assets/" "$<TARGET_FILE_DIR:BlackBoard>/assets") add_custom_command(TARGET BlackBoard POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${ULTRALIGHT_SDK_DIR}/resources" "$<TARGET_FILE_DIR:BlackBoard>/assets/resources")
问题原因
g_time_zone_new_identifier和g_memdup2是GLib 2.68及以上版本才新增的API,出现该错误说明系统中安装的GLib版本低于要求,而Ultralight SDK依赖的libgstreamer-full-1.0.so需要调用这些高版本GLib函数。
解决方案
方案1:升级系统GLib版本
在Debian/Ubuntu系系统中,可通过以下命令升级:sudo apt update sudo apt install libglib2.0-dev若官方源版本仍不满足,可考虑添加第三方PPA或手动编译安装高版本GLib。
方案2:调整CMake链接顺序
当前CMake使用link_libraries全局设置链接库,可能导致链接器优先使用Ultralight SDK目录下的旧版GLib相关库。修改Linux部分的CMake配置,改用target_link_libraries针对目标设置链接库,确保系统GLib库在Ultralight库之前链接:elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(GLIB REQUIRED glib-2.0) include_directories(${ULTRALIGHT_SDK_DIR}/include) link_directories(${ULTRALIGHT_SDK_DIR}/bin) add_executable(BlackBoard main.cpp) # 优先链接系统GLib和X11,再链接Ultralight相关库 target_link_libraries(BlackBoard ${GLIB_LIBRARIES} X11 UltralightCore AppCore Ultralight WebCore )方案3:检查SDK兼容性
确认下载的Ultralight SDK版本是否与当前系统GLib版本兼容,若SDK针对更高版本GLib编译,可选择升级系统或下载适配旧版GLib的Ultralight SDK版本(若官方提供)。
内容的提问来源于stack exchange,提问作者Maximilian Bastian
相关产品推荐
相关产品推荐

