在编译 C 程序之前如何检查库是否可用

How can I check if a library is available before compiling a C program

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

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

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

有没有办法进行验证?

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 编译器也很有可能通过渗透获得该功能。

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

这样做的老式方法是有一个预构建脚本尝试编译 #include "my_library.h",并根据结果输出带有 #define HAS_LIBRARY_SOMETHING 的配置文件为 0 或 1该操作。这就是像 autoconf 这样的程序部署的方法。