問題簡述
在 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_libsettings
和 H5detect
,用他們去替換掉編譯過程中生成的 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
進行編譯的情況,也是大同小異的操作。