Как я могу проверить, доступна ли библиотека перед компиляцией программы на C?

Есть ли способ включить библиотеку, только если она доступна для компилятора?

Я думал о том, чтобы проверить это с #ifndef (как показано ниже), но он просто проверяет, не определено ли имя макроса, и что мне действительно нужно, это проверить, может ли компилятор обращаться к библиотеке C во время компиляции.

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

Есть ли способ сделать эту проверку?

1 ответ

Решение

Clang и GCC имели __has_include макрос в течение очень долгого времени, который вы можете использовать так:

#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 недавно был помечен стандарт C++ 17, что означает, что компиляторы C++, которые его не поддерживают, скорее всего, будут иметь его не слишком далеко. Поскольку это функция препроцессора, компиляторы C, принадлежащие к тому же набору, что и компилятор C++, также имеют высокие шансы получить эту функцию с помощью осмоса.

Тем не менее, обратите внимание, что в то время как __has_include скажет вам, если файл заголовка присутствует, он не спасет вас от возможных ошибок компоновщика в случае сбоя установки.

Старомодный способ сделать это - иметь скрипт перед сборкой, который пытается скомпилировать #include "my_library.h"и выведите файл конфигурации с #define HAS_LIBRARY_SOMETHING до 0 или 1 в зависимости от результата этой операции. Это подход, который используют такие программы, как autoconf.

Другие вопросы по тегам