2012-08-19 46 views
15

Tôi có mã sau đây mà tôi đang cố gắng biên dịch. Khi tôi đã thử với std = c99 nó không thành công với cảnh báo về "khai báo ngầm định của kiểu struct addrinfo" và "khai báo ngầm của hàm getaddrinfo". Nó hoạt động với std = gnu99.Tại sao không thể tìm thấy getaddrinfo khi biên dịch với gcc và std = c99

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 

int fails(const char *host, const char *port, struct addrinfo *hints) 
{ 
     int rc; 
     struct addrinfo *results; 

     // can't find this function?? 
     rc = getaddrinfo(host, port, hints, &results); 

     // free memory in this important application 
     freeaddrinfo(results); 

     return rc; 
} 

Các lệnh tôi đã sử dụng để biên dịch là:

gcc -c -o fail.o -Wall -Werror -std=c99 -save-temps fail.c 
gcc -c -o fail.o -Wall -Werror -std=gnu99 -save-temps fail.c 

Nhìn vào fail.i (xử lý trước tiêu đề) Tôi thấy trình biên dịch đó là đúng: những loại chưa được khai báo trong phần đầu kéo trong

Vì vậy, tôi đã đi đến các tiêu đề và nhận thấy rằng getaddrinfo được bao quanh bởi một bảo vệ #ifdef __USE_POSIX, rõ ràng là không được khai báo khi biên dịch với c99.

Làm cách nào để nói với gcc rằng tôi muốn sử dụng c99 và POSIX? Tôi không thực sự muốn sử dụng gnu99 trong trường hợp tôi quyết định chuyển đổi trình biên dịch sau (ví dụ: Clang hoặc icc).

+0

Bạn đã thử 'gcc -c -ofail.o - Tường -Werror -std = c99 -D__POSIX -kết nối temps.c.c? Điều đó hoặc tạo một điểm cho '#define __POSIX' ở trên cùng của' fail.c'. – oldrinb

+0

Nhân tiện, bạn có chắc đó là '__POSIX' chứ không phải' _POSIX_C_SOURCE'? – oldrinb

+0

Tôi vừa kiểm tra lại và nó là ___USE_POSIX – dave

Trả lời

Các vấn đề liên quan