Linking HDF5 with CMake for C, C++ and Fortran
CMake links HDF5 into the C, C++, or Fortran program with just two lines in CMakeLists.txt. If experiencing trouble finding HDF5 with CMake, try FindHDF5.cmake, which is more up to date than the FindHDF5.cmake included with CMake. An example CMake for writing network data to HDF5 in C: CMakeLists.txt.
We show an example for C and another example for Fortran. “HL” refers to the high-level HDF5 interface that is more convenient and thus commonly used.
Note: if terminal has the Conda environment loaded and you keep getting the Conda HDF5 library, do first:
conda deactivate
before running the CMake configure commadn.
project(myproj LANGUAGES C)
find_package(HDF5 REQUIRED COMPONENTS C HL)
add_executable(myprog myprog.c)
target_link_libraries(myprog PRIVATE HDF5::HDF5)
project(myproj LANGUAGES Fortran)
find_package(HDF5 REQUIRED COMPONENTS Fortran HL)
add_executable(myprog myprog.f90)
target_link_libraries(myprog PRIVATE HDF5::HDF5)
HDF5 C example
The Fortran HDF5 syntax is quite similar.
#include "hdf5.h"
int main(void) {
hid_t file_id, dataset_id,dataspace_id; /* identifiers */
herr_t status;
int i, j, dset_data[4][6], read_data[4][6];
hsize_t dims[2];
/* Initialize the dataset. */
for (i = 0; i < 4; i++)
for (j = 0; j < 6; j++)
dset_data[i][j] = i * 6 + j + 1;
/* Create a new file using default properties. */
file_id = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
/* Create the data space for the dataset. */
dims[0] = 4;
dims[1] = 6;
dataspace_id = H5Screate_simple(2, dims, NULL);
/* Create the dataset. */
dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, dataspace_id,
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
/* Write the dataset. */
status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
dset_data);
/* End access to the dataset and release resources used by it. */
status = H5Dclose(dataset_id);
//------------------------------------------------------
/* Open an existing dataset. */
dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT);
status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
read_data);
for (i = 0; i < 4; i++)
for (j = 0; j < 6; j++)
printf("%d ",read_data[i][j]); // 1-24
/* Close the dataset. */
status = H5Dclose(dataset_id);
/* Close the file. */
status = H5Fclose(file_id);
return 0;
}
HDF5 compiler script
As an alternative to CMake, HDF5 compiler script h5cc links HDF5 and necessary libraries:
h5cc myprog.c func.c -lm
h5cc
: Ch5c++
: C++h5fc
: Fortran