首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查netcdf库是否支持netcdf4

检查netcdf库是否支持netcdf4
EN

Stack Overflow用户
提问于 2021-08-26 14:37:25
回答 1查看 49关注 0票数 0

有没有人知道有没有办法在运行时或用户编译时检查netcdf库构建是否包含对netcdf4的支持?

有一个函数nc_inq_libvers(),但是版本号本身并不有用,因为现代的库版本仍然可以在关闭netcdf4支持的情况下构建。

我只是希望能够编写代码,检查是否支持netcdf4,如果支持,则创建netcdf4文件,如果不支持,则创建netcdf3文件。

EN

回答 1

Stack Overflow用户

发布于 2021-08-26 17:34:37

理想方法

研究该库的源代码,以获得一些可以在编译时或运行时检查的#define(您还可以查看该库的构建过程,以便发现是否进行了此类定义)。

然后,检查是否支持就很简单了;例如,如果库定义了NETCDF4_SUPPORT_ENABLED

代码语言:javascript
复制
// compile-time check
#ifdef NETCDF4_SUPPORT_ENABLED
  int main(void) {
    // use netcdf4 format...
  }
#else
  int main(void) {
    // use netcdf3 format...
  }
#endif

更复杂的方法:(以防库没有这样的#define)

您需要更改程序的配置/构建过程。在构建程序时,由您编写的脚本可能会检查NETCDF库是否已使用NETCDF4支持进行编译;如果启用了支持,则配置脚本可能会将参数-DNETCDF4_SUPPORT_ENABLED添加到用于编译程序的命令中,因此可以像前一个解决方案中那样进行处理。

编写一个脚本来检测NETCDF库是否启用了NETCDF4支持是由您决定的,不同的解决方案适用于不同的库。

一个真正的(真正的)肮脏的黑客,只在核攻击的情况下使用,是编写一个小的C程序,像这样(您的配置脚本将尝试编译,以便检测NETCDF4支持):

代码语言:javascript
复制
#include <assert.h>
static_assert(sizeof( foo() ) != sizeof(int), "NETCDF4 support is not available");
// NOTE: replace `foo` with a library function that doesn't return `int` (nor another type with the same size of `int`)
// this code will fail to build if function `foo` is missing

foo替换为库函数的名称,如果禁用NETCDF4支持,该库函数将不会包含在库中(此外,函数的返回类型大小必须与int的大小不同,例如:它可能返回long longcharvoid等)。

但我认为对于NETCDF库的具体情况可能会找到更好的解决方案(之前的攻击是库不可知的,但真的很脏)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68940591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档