如何用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
相关产品推荐
相关产品推荐

