有没有人知道有没有办法在运行时或用户编译时检查netcdf库构建是否包含对netcdf4的支持?
有一个函数nc_inq_libvers(),但是版本号本身并不有用,因为现代的库版本仍然可以在关闭netcdf4支持的情况下构建。
我只是希望能够编写代码,检查是否支持netcdf4,如果支持,则创建netcdf4文件,如果不支持,则创建netcdf3文件。
发布于 2021-08-26 17:34:37
理想方法
研究该库的源代码,以获得一些可以在编译时或运行时检查的#define(您还可以查看该库的构建过程,以便发现是否进行了此类定义)。
然后,检查是否支持就很简单了;例如,如果库定义了NETCDF4_SUPPORT_ENABLED
// 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支持):
#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 long、char、void等)。
但我认为对于NETCDF库的具体情况可能会找到更好的解决方案(之前的攻击是库不可知的,但真的很脏)。
https://stackoverflow.com/questions/68940591
复制相似问题