Вы должны игнорировать unistd.h
.Это объявление существует для совместимости с POSIX, но GLIB удалил определение для crypt
, когда они перешли на libxcrypt
, чтобы разработать эти функции в изоляции от glibc.Это означает, что вы все еще можете получить ABI-совместимость, но должны указывать ссылку в crypt
.Вы можете узнать больше об этом здесь
Доступность в glibc
Функции crypt ()
, encrypt ()
и setkey ()
являются частью POSIX.1-2008 XSI Options Group для шифрования и не являются обязательными.Если интерфейсы недоступны, то символическая константа _XOPEN_CRYPT
либо не определена, либо определена в -1 и может быть проверена во время выполнения с помощью sysconf ()
.
Это может иметь место, если нисходящий дистрибутив имеетпереключился с крипты glibc на libxcrypt
.При перекомпиляции приложений в таких дистрибутивах пользователь должен определить, недоступен ли _XOPEN_CRPYT
, и включить crypt.h для прототипов функций;в противном случае libxcrypt
является заменой, совместимой с ABI.
Что касается того, почему, даже если вы связываете определение, оно не сбрасывается с
#define _XOPEN_VERSION 700
#define _POSIX_VERSION 200809L
#define __USE_MISC 1
#define _XOPEN_SOURCE
Ну, естьнесколько вещей, которые там происходят
- Единственный заголовок, который имеет значение в
unistd.h
, это __USE_MISC
. unistd.h
включает features.h
, что undef
s__USE_
макросы для запуска с «чистого листа» - Единственный способ определить
__USE_MISC
- это определить _GNU_SOURCE
.
Если вы хотитеизвлеките объявление crypt.h
из unistd.h
, которое вы должны определить _GNU_SOURCE
! Эти два примера, приведенные с справочной страницы crypt.h
, делают то же самое, и независимо от того, включаете ли вы unistd.h
или crypt.h
, вы ДОЛЖНЫ также определять _GNU_SOURCE
в современных версиях glibc.
Таким образом, вы можете либо сделать,
#define _GNU_SOURCE
#include <unistd.h>
Или
#define _GNU_SOURCE
#include <crypt.h>
Но поскольку вы должны ссылаться на crypt
(-lcrypt
), я бы предложилиспользуя объявление в crypt.h
для здравомыслия.