为 C 和 Fortran 库编写 CMake Find Netcdf

Write CMake Find Netcdf for C and Fortran library

大家好,感谢您的帮助,

我是 CMAKE 的新手,我尝试为 C 和 Fortran NETCDF 库编写一个查找库。问题是 fortran 和 C netcdf 的位置和版本可能不同。

对于 fortran 库,我搜索 netcdf.mod(包含模块)和 libnetcdff.so(动态库)对于 C 库,我搜索 netcdf.hlibnetcdf.so

在网上我找到了一个能正确找到 netcdf C 库的神奇代码:

find_path (NETCDF_INCLUDES_C netcdf.h HINTS NETCDF_DIR NETCDF_DIR)
message(" inc =  ${NETCDF_INCLUDES_C}  ")
find_library (NETCDF_LIBRARIES_C  NAMES netcdf)
message(" lib =  ${NETCDF_LIBRARIES_C}  ")

而且两条路径都是正确的。我尝试回复 fortran 的代码:

find_path (NETCDFF_INCLUDES_F90 netcdff.mod HINTS NETCDFF_DIR NETCDFF_DIR)
message(" inc ff =  ${NETCDFF_INCLUDES_F90}  ")
find_library (NETCDFF_LIBRARIES_F90  NAMES netcdff HINTS NETCDFF_DIR )
message(" lib ff=  ${NETCDFF_LIBRARIES_F90}  ")
mark_as_advanced(NETCDF_LIBRARIES_F90)

但是两个F90路径都是空的,可能是因为我不明白cmake是如何找到C库的。通过 MODULE ENVIRONMENT 我加载库和模块加载 env var:

   $NETCDFF_HOME $NETCDFF_INC $NETCDFF_INCLUDE $NETCDFF_LIB
   $NETCDF_HOME  $NETCDF_INC  $NETCDF_INCLUDE  $NETCDF_LIB 

我错误地假设 CMAKE 搜索 NETCDF_DIR 变量并进入此搜索 netcdf.h 但在我的 CmakeList 和我的 ENV 中未定义该变量。

CMake 如何找到 C 变量?以及如何将查找回复到 Fortran 库?

感谢帮助我

此致

埃里克

也许我的本身不是答案,但你不能只使用 VTK 附带的 FindNetCDF.cmake 吗?
https://github.com/Kitware/VTK/blob/master/CMake/FindNetCDF.cmake
还是来自其他用户的和上一个类似的(他们可以寻找Fortran和C组件)?
https://github.com/bilke/cmake-modules/blob/master/FindNetCDF.cmake
https://github.com/jedbrown/cmake-modules/blob/master/FindNetCDF.cmake
如果您包含此文件,那么您可以通过以下方式检索所需的组件:

set (NETCDF_F90 "YES")
find_package (NetCDF REQUIRED)
include_directories(${NETCDF_INCLUDES})
target_link_libraries (uses_f90_interface ${NETCDF_LIBRARIES})
target_link_libraries (only_uses_c_interface ${NETCDF_LIBRARIES_C}) 

或者在 VTK 版本的情况下类似

find_package (NetCDF COMPONENTS F90)
include_directories(NETCDF_F90_INCLUDE_DIRS)
target_link_libraries (only_uses_f90_interface ${NETCDF_F90_LIBRARIES})

如 VTK 版本所述,您可以通过以下方式为 C 和 Fortran 库传递不同的搜索目录:

When interfaces are requested the user has access to interface specific hints:

NETCDF_${LANG}_INCLUDE_DIR - where to search for interface header files
NETCDF_${LANG}_LIBRARY     - where to search for interface libraries