../main.c:8:18: error: storage size of ‘hints’ isn’t known
../main.c:13:19: error: ‘AI_PASSIVE’ undeclared (first use in this function)
../main.c:16:3: warning: implicit declaration of function ‘gai_strerror’
Похоже, что gcc не связывается с netdb.h ....
Это не ссылки ошибок, и вам не нужен общий объект netdb
файл (такого зверя нет; netdb.h
просто определяет структуры данных
и макросы для использования в вашем коде).
Это ошибки компилятора: gcc жалуется, потому что вы используете имена
что он не распознает (AI_PASSIVE
) и типы данных, для которых
структура неизвестна (struct addrinfo
).
Код, который вы представили, кажется правильным, и addrinfo
определяется в /usr/include/netdb.h
. Что произойдет, если вы скомпилируете это
как это:
gcc -c main.c
У вас все еще такое же поведение? Если это так, взгляните на вывод
из:
gcc -E main.c
Это генерирует предварительно обработанную версию кода со всеми
#include
заявления заменены их фактическим содержанием. Вы должны быть
в состоянии пройти через это и посмотреть, действительно ли компилятор получает
/usr/include/netdb.h
если находит что-то еще:
$ gcc -E foo.c | grep netdb.h | awk '{print $3}' | sort -u
Что в моей системе дает:
"/usr/include/bits/netdb.h"
"/usr/include/netdb.h"
"/usr/include/rpc/netdb.h"
Когда вы добавляете -ansi
в командную строку, вы меняете способ
gcc
ведет себя так, что сломает ядро Linux и многие системы
заголовочные файлы. Определение addrinfo
в netdb.h
защищено
как это:
#ifdef __USE_POSIX
/* Structure to contain information about address of a service provider. */
struct addrinfo
{
int ai_flags; /* Input flags. */
int ai_family; /* Protocol family for socket. */
int ai_socktype; /* Socket type. */
int ai_protocol; /* Protocol for socket. */
socklen_t ai_addrlen; /* Length of socket address. */
struct sockaddr *ai_addr; /* Socket address for socket. */
char *ai_canonname; /* Canonical name for service location. */
struct addrinfo *ai_next; /* Pointer to next in list. */
};
// ...other stuff...
#endif
Когда вы запускаете gcc
с флагом -ansi
, это отменяет
__USE_POSIX
макрос, потому что вещи, защищенные этим, могут не быть
строго соответствует ANSI. Вы можете увидеть разницу, если вы сравните
это:
gcc -E /usr/include/netdb.h
С этим:
gcc -E -ansi /usr/include/netdb.h
Только первая содержит структуру addrinfo
.