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

如何用Yocto构建的LibXML2替换DBCPPP自带的LibXML2?

Yocto构建DBCPPP时LibXML2冲突及链接错误解决

问题背景

  • 应用依赖GitHub仓库DBCPPP,该仓库原本将LibXML2作为子模块一同构建
  • Yocto构建时出现文件冲突:Linux内核与DBCPPP配方均尝试安装/usr/lib/libxml2.so.2.9.10
  • 目标方案:阻止DBCPPP生成LibXML2库文件,转而使用Yocto构建的LibXML2

当前CMakeLists.txt配置

cmake_minimum_required(VERSION 3.12)
project("libdbcppp" VERSION 0.1.0)

set(LIBXML2_INCLUDE_DIR /mnt/WorkDrive/Documents/EVCC_Application/build-fb/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/libxml2/2.9.10-r0/libxml2-2.9.10/include)
set(LIBXML2_LIBRARIES /mnt/WorkDrive/Documents/EVCC_Application/build-fb/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/libxml2/2.9.10-r0/image/usr/lib)

#include(FindPkgConfig)
#include(FindLibXml2 REQUIRED)
find_package(LibXml2 REQUIRED)

option(build_tests "Build tests" ON)
option(build_examples "Build examples" ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_STATIC_LIBRARY_PREFIX "")
set(CMAKE_SHARED_LIBRARY_PREFIX "")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
    add_definitions("/bigobj")
endif()

include_directories("include")
include_directories("third-party/libxmlmm/libxmlmm")
include_directories("/mnt/WorkDrive/Documents/EVCC_Application/build-fb/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/boost")
include_directories("/mnt/WorkDrive/Documents/EVCC_Application/build-fb/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/libxml2/2.9.10-r0/libxml2-2.9.10/include")
include_directories("third-party/cxxopts/include")

file(GLOB libxmlmm_header
    "third-party/libxmlmm/libxmlmm/*.h"
)
file(GLOB libxmlmm_src
    "third-party/libxmlmm/libxmlmm/*.cpp"
)

add_library(libxmlmm SHARED "")
target_link_libraries(libxmlmm LibXml2::LibXml2)

target_sources("libxmlmm"
    PRIVATE ${libxmlmm_header}
    PRIVATE ${libxmlmm_src}
)


install(TARGETS "libxmlmm" EXPORT ${PROJECT_NAME}Targets DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(
    DIRECTORY "libxmlmm"
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libxmlmm
    FILES_MATCHING PATTERN "*.h")

set(CMAKE_STATIC_LIBRARY_PREFIX "")
set(CMAKE_SHARED_LIBRARY_PREFIX "")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

CONFIGURE_FILE(
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  IMMEDIATE @ONLY
)

ADD_CUSTOM_TARGET(uninstall
  "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
)

Yocto构建报错信息

error: /mnt/WorkDrive/Documents/MAIN_Application/build-fb/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/libxml2/2.9.10-r0/image/usr/lib: read: Is a directory
| collect2: error: ld returned 1 exit status
| ninja: build stopped: subcommand failed.
| WARNING: exit code 1 from a shell command.

关键问题分析

报错核心原因是LIBXML2_LIBRARIES被设置为目录路径而非具体库文件,链接器尝试读取目录导致失败。Ubuntu环境下可能因默认库路径覆盖了错误配置,但Yocto的交叉构建环境会严格检查路径有效性。

修复方案

  • 修正LibXML2库路径设置
    将LIBXML2_LIBRARIES指向具体的库文件,而非目录:

    set(LIBXML2_LIBRARIES /mnt/WorkDrive/Documents/EVCC_Application/build-fb/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/libxml2/2.9.10-r0/image/usr/lib/libxml2.so)
    
  • 移除硬编码路径,改用Yocto自动依赖探测
    硬编码路径在Yocto构建中不可靠,应依赖Yocto注入的环境信息:

    # 取消手动设置LIBXML2_INCLUDE_DIR和LIBXML2_LIBRARIES
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(LibXml2 REQUIRED IMPORTED_TARGET libxml-2.0)
    # 链接时使用PkgConfig::LibXml2替代原LibXml2::LibXml2
    target_link_libraries(libxmlmm PkgConfig::LibXml2)
    
  • 确保DBCPPP不构建LibXML2子模块
    在Yocto配方中添加SRC_URI时,排除LibXML2子模块:

    SRC_URI = "git://github.com/xxxx/dbcppp.git;branch=main;submodules=exclude:libxml2"
    
  • 验证安装步骤
    确保CMake的install指令仅安装DBCPPP相关文件,不包含LibXML2的库或头文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:01:29