【问题标题】:How can I check if a library is available before compiling a C program如何在编译 C 程序之前检查库是否可用
【发布时间】:2018-10-31 14:39:30
【问题描述】:

有没有办法只在编译器可用的情况下才包含库?

我曾考虑使用#ifndef(如下所示)检查它,但它只是检查是否未定义宏名称,而我真正需要的是检查编译器是否可以在编译时访问 C 库。

#ifndef _MY_LIBRARY_H
    #include "my_library.h"
#endif

有没有办法进行此验证?

【问题讨论】:

  • 一种流行的方法是使用 GNU autoconf。

标签: c macros compilation-time


【解决方案1】:

Clang 和 GCC 有一个 __has_include macro 很长时间了,你可以这样使用:

#if __has_include("my_library.h")
    #include "my_library.h"
#endif

它也适用于尖括号(事实上,它适用于任何你可以传递给#include的东西):

#if __has_include(<my_library.h>)
    #include <my_library.h>
#endif

__has_include 最近被指定为standard C++17,这意味着现在不支持它的 C++ 编译器很可能会在不远的地方拥有它。由于它是一种预处理器功能,因此与 C++ 编译器属于同一套件的 C 编译器也很有可能通过 osmosis 获得该功能。

不过,请注意,虽然__has_include 会告诉您头文件是否存在,但它不会在安装损坏的情况下使您免于最终的链接器错误。

执行此操作的老式方法是使用预构建脚本尝试编译#include "my_library.h",并根据该操作的结果将带有#define HAS_LIBRARY_SOMETHING 的配置文件输出为0 或1。这是 autoconf 等程序部署的方法。

【讨论】:

  • 感谢您的帮助和参考。效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多