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

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

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

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

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

1 Ответ

0 голосов
/ 22 мая 2018

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...