【问题标题】:check if netcdf library supports netcdf4检查 netcdf 库是否支持 netcdf4
【发布时间】:2021-10-26 15:17:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: c netcdf netcdf4


    【解决方案1】:

    理想方法

    调查库的一些#defines 的源代码,您可以在编译时或运行时检查它们(您也可以查看库的构建过程,以发现是否进行了此类定义)。

    然后检查支持是微不足道的;例如,如果库定义了NETCDF4_SUPPORT_ENABLED:

    // compile-time check
    #ifdef NETCDF4_SUPPORT_ENABLED
      int main(void) {
        // use netcdf4 format...
      }
    #else
      int main(void) {
        // use netcdf3 format...
      }
    #endif
    

    更复杂的方法:(以防图书馆不这样做#defines)

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

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

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

    #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 库的特定情况可能会找到更好的解决方案(之前的 hack 与库无关,但确实很脏)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2011-10-17
      • 2011-10-26
      • 2023-03-22
      相关资源
      最近更新 更多