【问题标题】: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
有没有办法进行此验证?
【问题讨论】:
标签:
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 等程序部署的方法。