解決vcpkg無法交叉編譯arm64版本 HDF5 庫的問題


問題簡述

在 linux x64 下使用交叉編譯 arm64 版本的 hdf5 庫會遇到一個問題,就是在編譯出可執行文件

bin/H5detect
bin/H5make_libsettings

arm64 架構的,但是在編譯過程中需要使用到他們去生成一些代碼文件,導致出錯無法編譯。
這個錯誤與是不是使用 vcpkg 編譯無關,直接使用 cmake 生成 Makefile 去編譯也是一樣的。
因為 x64 的機器無法直接運行 arm64 的程序。

這兩個程序的調用分別在:

  • hdf5/bin/batch/knl_H5detect.sl.in.cmake
    # Inputs:  Build directory, output file name, executable file name (username/email if available).
    PROGNAME=H5detect
    OUTPUT=H5Tinit.c
    
    CMD="@HDF5_BINARY_DIR@/bin/${PROGNAME} @HDF5_GENERATED_SOURCE_DIR@/${OUTPUT}"
    echo "Run $CMD"
    srun -n 1 $CMD
    echo "Done running $CMD"
    
  • src/CMakeLists.txt
    add_custom_command (
        OUTPUT ${HDF5_BINARY_DIR}/H5lib_settings.c
               ${HDF5_BINARY_DIR}/gen_SRCS.stamp2
        COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:H5make_libsettings>
        ARGS ${HDF5_BINARY_DIR}/H5lib_settings.c
        COMMAND    ${CMAKE_COMMAND}
        ARGS       -E touch ${HDF5_GENERATED_SOURCE_DIR}/gen_SRCS.stamp2
        DEPENDS H5make_libsettings
        WORKING_DIRECTORY ${HDF5_BINARY_DIR}
    )
    

這個其實是我在使用 vcpkg 編譯 gdal 時候發現的問題,如果你不需要 gdal 支持相應的依賴(driver)可以打開 vcpkg/ports/gdal/CONTORL 文件,把Build-Depends:里面的相關項移除掉。

解決辦法

這個解決也不難,從上面的代碼可以知道,H5make_libsettings 是要在模擬器上運行的,所以這里可以做一點手腳。

先使用 vcpkg 編譯了 x64 版本的程序,所以我本地是有 x64 版本的 H5make_libsettingsH5detect,用他們去替換掉編譯過程中生成的 arm64 版本即可。

但是 vcpkg 每次都會重新編譯,所以必須要在編譯過程中替換。所以可以自己寫一個 EMULATOR 模擬器來做這件事。

下面的 vcpkg 所在路徑請根據實際情況確定。

解決步驟如下:

  • 1、寫一個 hdf5emulator.sh 腳本文件,內容如下:
    #!/bin/bash
    mkdir -p /mnt/build/vcpkg/buildtrees/hdf5/arm64-linux-rel/bin/
    cp -pPf /mnt/build/vcpkg/buildtrees/hdf5/x64-linux-rel/bin/H5* /mnt/build/vcpkg/buildtrees/hdf5/arm64-linux-rel/bin/
    $@
    
  • 2、修改 vcpkg 內的 vim ports/hdf5/portfile.cmake 文件,找到vcpkg_configure_cmake位置,在 OPTIONS 下添加一行,修改后的結果如下:
    vcpkg_configure_cmake(
        SOURCE_PATH ${SOURCE_PATH}
        DISABLE_PARALLEL_CONFIGURE
        PREFER_NINJA
        OPTIONS
    	  -DCMAKE_CROSSCOMPILING_EMULATOR=/mnt/build/vcpkg/hdf5emulator.sh  # 這行是添加的
            ${FEATURE_OPTIONS}
            -DBUILD_TESTING=OFF
            -DHDF5_BUILD_EXAMPLES=OFF
            -DHDF5_INSTALL_DATA_DIR=share/hdf5/data
            -DHDF5_INSTALL_CMAKE_DIR=share
            -DHDF_PACKAGE_NAMESPACE:STRING=hdf5::
    )
    

按照上面兩步進行操作之后,重新編譯即可正常生成。
對於是 cmake 生成 Makefile 進行編譯的情況,也是大同小異的操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM