Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写CMake Find Netcdf for C和Fortran库_C_Cmake_Fortran_Shared Libraries_Netcdf - Fatal编程技术网

编写CMake Find Netcdf for C和Fortran库

编写CMake Find Netcdf for C和Fortran库,c,cmake,fortran,shared-libraries,netcdf,C,Cmake,Fortran,Shared Libraries,Netcdf,大家好,谢谢你们的帮助 我是CMAKE的新手,我试图为C和Fortran NETCDF库编写一个查找库。问题是fortran和C netcdf的位置和版本可能不同 对于fortran库,我搜索netcdf.mod(包括模块)和libnetcdff.so(动态库),而对于C库,我搜索netcdf.h和libnetcdf.so 在web上,我找到了一个可以正确找到netcdf C库的神奇代码: find_path (NETCDF_INCLUDES_C netcdf.h HINTS NETCDF_DI

大家好,谢谢你们的帮助

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

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

在web上,我找到了一个可以正确找到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 search NETCDF_DIR变量并将其放入这个search NETCDF.h中,但在我的CmakeList和我的ENV中没有定义该变量

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

谢谢你帮助我

致意


Eric

也许我的答案本身不是答案,但你不能使用VTK附带的FindNetCDF.cmake吗?

或者来自其他用户的,看起来与前一个类似(他们可以查找Fortran和C组件)?


如果包含此文件,则可以通过以下方式检索所需的组件:

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库的不同搜索目录:

请求接口时,用户可以访问特定于接口的提示:


你真的是指
netcdff.mod
还是想要
netcdf.mod
?另外,我也不太清楚
cmake
,但是如果看起来您可能试图存储在
NETCDFF\u INCLUDES\u F90
中,但是您的邮件使用了
${NETCDF\u INCLUDES\u F90}
(即第一个字母中有一个额外的F),这要感谢您的回复,在复制和粘贴中会出现一些错误。正确的包含模块文件是netcdf.mod,消息在NETCDFF_INCLUDES_F90上,我更正了我以前的帖子。您正在运行哪个版本的CMake?我想您忘记更正模块文件名了。CMake版本是3.5.2,模块的正确名称是netcdf.mod。我已经尝试过这个示例,但只有在C和Fortran lib位于同一目录下时,所有模块才会运行。因为脚本首先找到C库的位置,然后在同一个目录中搜索另一个。更新的答案,因为当您请求特定于语言的接口时,您可以为包含和库指定不同的搜索目录…多亏了帮助,我尝试了您的建议!netCDF有许多不同的构建方式,autoconf/automake/libtool完全可以找到他们需要的所有信息。然而,cmake甚至很难找到基本信息,因为它显然不使用.so文件(在该文件中可以找到所有信息),而只是希望netCDF也与cmake一起安装,以便提供特殊的cmake安装信息。但通常情况并非如此。所以在其他项目中,我也很难将netCDF支持应用到cmake构建中。
NETCDF_${LANG}_INCLUDE_DIR - where to search for interface header files
NETCDF_${LANG}_LIBRARY     - where to search for interface libraries