Ответ 1
В функциях #defines __ GNU_LIBRARY __, __ GLIBC __ и __ GLIBC_MINOR __ (6, 2 и 11 в моей системе с glibc-2.11).h.
Я пытаюсь реализовать функции backtrace для большой структуры, которая используется для разных платформ и OS'es. В некоторых из них он связан с glibc, а в другом - что-то другое (например, uclibc). Функция backtrace() существует только в первом.
Можно ли определить, используется ли glibc? Любой #define? Я не смог найти ответ в руководстве glibc. Я знаю, что во время компиляции я не могу иметь информацию о времени компоновки, но думаю, что файлы должны отличаться. По крайней мере, нужно возвращать назад. Я хотел бы проверить его, не будучи вынужденным передавать явные флаги компилятору.
В функциях #defines __ GNU_LIBRARY __, __ GLIBC __ и __ GLIBC_MINOR __ (6, 2 и 11 в моей системе с glibc-2.11).h.
Включить features.h, он содержит необходимые вам макросы, например.
#define __GNU_LIBRARY__ 6
/* Major and minor version number of the GNU C library package. Use
these macros to test for features in specific releases. */
#define __GLIBC__ 2
#define __GLIBC_MINOR__ 4
Проверка макросов препроцессора не - хорошее решение. uClibc и, возможно, другие реализации libc определяют макросы для имитации glibc (без предоставления всей своей раздутой функциональности) по тем же причинам, что и все браузеры включают в себя "Mozilla" в своих строках User-Agent: сломанные программы, которые ожидают увидеть glibc и отключить партии функций, если они этого не видят.
Вместо этого вы должны написать configure script для проверки backtrace
и использовать его только в том случае, если он доступен.
Опытным путем оба из следующих компилируются и работают нормально на GCC 6.4:
#include <stdio.h>
int main(void) {
#ifdef __GLIBC__
puts("__GLIBC__");
#endif
return 0;
}
а также:
int main(void) {
#ifdef __GLIBC__
puts("__GLIBC__");
#endif
return 0;
}
но только первый, конечно, дает результат.
Это должно означать, что __GLIBC__
происходит из stdio.h
который должен включать features.h
, см. Также: Какова цель заголовка features.h?
Следовательно, строго говоря, __GLIBC__
сам по себе не является четким указанием на то, что используется glibc, поскольку даже без заголовков GCC уже встраивает объекты времени выполнения, такие как crt1.o
в исполняемый файл финала, а те, которые приходят из glibc.
Итак, главный нерешенный вопрос: гарантирует ли glibc, что features.h
включается в каждый заголовок? Я не мог найти ясную цитату документации. СДЕЛАТЬ.