c - 为 C 和 Fortran 库编写 CMake Find Netcdf

标签 c cmake fortran shared-libraries netcdf

大家好,感谢您的帮助,

我是 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 我加载库并加载该环境变量的模块:

   $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 var?以及如何将找到的结果回复到 fortran lib?

谢谢你帮助我

致以诚挚的问候

埃里克

最佳答案

也许我的答案本身并不是一个答案,但是你不能使用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

关于c - 为 C 和 Fortran 库编写 CMake Find Netcdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41571163/

相关文章:

编译错误: unable to open include file

c - 如果语句不识别真实条件?

fortran - Fortran 中的 Asterisk : Syntax error in argument list at (1)

arrays - 我可以在 Fortran 中使用可分配数组作为意图(输出)矩阵吗?

c - 在后台运行一个简单的 C Web 服务器

在 C 中将 void* 从短数组 (short*) 转换为 float 数组 (float)

android - cmake中生成asm文件后调用shell命令

cmake - 在 CMake 中从变量中剥离路径

c - 将 .a 库与 CMake 链接

python - 如何访问用 Python 编写的 FORTRAN 函数?