2009-06-10 37 views
143

Tôi nhận được một số những cảnh báo này khi biên dịch một vài mã nhị phân:cảnh báo: không tương thích tuyên bố ngầm được xây dựng trong chức năng 'xyz'

warning: incompatible implicit declaration of built-in function ‘strcpy’ 
warning: incompatible implicit declaration of built-in function ‘strlen’ 
warning: incompatible implicit declaration of built-in function ‘exit’ 

Để cố gắng giải quyết điều này, tôi đã thêm

#include <stdlib.h> 

ở phía trên cùng của file C liên quan đến cảnh báo này, ngoài việc biên soạn với những lá cờ sau:

CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc 

Tôi đang sử dụng GCC 4.1.2:

$ gcc --version 
gcc (GCC) 4.1.2 20080704 

Tôi nên làm gì để giải quyết những cảnh báo này?

+5

Bạn có thể đăng mã không thành công không? – mkb

+7

Rất tiếc, tôi không được phép đăng lại mã này. –

Trả lời

238

Trong C, sử dụng hàm chưa khai báo trước đây cấu thành một khai báo ngầm định của hàm. Trong khai báo ngầm, kiểu trả về là int nếu tôi nhớ chính xác. Bây giờ, GCC có các định nghĩa dựng sẵn cho một số hàm chuẩn. Nếu một khai báo ngầm không khớp với định nghĩa dựng sẵn, bạn sẽ nhận được cảnh báo này.

Để khắc phục sự cố, bạn phải khai báo các hàm trước khi sử dụng chúng; thông thường bạn làm điều này bằng cách bao gồm tiêu đề thích hợp. Tôi khuyên bạn không nên sử dụng cờ -fno-builtin- * nếu có thể.

Thay vì stdlib.h, bạn nên cố gắng

#include <string.h> 

Đó là nơi strcpystrncpy được định nghĩa, ít nhất là theo strcpy (2) người đàn ông.

Chức năng exit được định nghĩa trong stdlib.h, tuy nhiên, vì vậy tôi không biết điều gì đang xảy ra ở đó.

+0

Cảm ơn, tôi có khoảng 20 tệp .c để dọn dẹp và bỏ lỡ thêm một số tiêu đề. –

+0

Giải quyết vấn đề của tôi khi cố gắng biên dịch chương trình C để kiểm tra loại ảo hóa (Xen HVM/KVM/VMware/Bare Metal), tuyệt! Cảm ơn. –

17

Trong trường hợp một số chương trình, các lỗi này là bình thường và không nên sửa.

Tôi nhận được các thông báo lỗi này khi biên dịch chương trình phrap (ví dụ). Chương trình này xảy ra chứa mã sửa đổi hoặc thay thế một số chức năng dựng sẵn và khi tôi đưa các tệp tiêu đề thích hợp để sửa các cảnh báo, GCC thay vào đó tạo ra một loạt lỗi. Vì vậy, sửa chữa các cảnh báo có hiệu quả phá vỡ xây dựng.

Nếu bạn có nguồn như một phần của bản phân phối cần biên dịch bình thường, các lỗi có thể là bình thường. Tham khảo tài liệu để chắc chắn.

11

Dưới đây là một số mã C sản xuất các lỗi nêu trên:

int main(int argc, char **argv) { 
    exit(1); 
} 

Biên soạn như thế này trên Fedora 17 Linux 64 bit với gcc:

[email protected] ~/foo2 $ gcc -o n n2.c                
n2.c: In function ‘main’: 
n2.c:2:3: warning: incompatible implicit declaration of built-in 
function ‘exit’ [enabled by default] 
[email protected] ~/foo2 $ ./n 
[email protected] ~/foo2 $ 

Để thực hiện các cảnh báo đi đi, thêm tuyên bố này vào đầu tệp:

#include <stdlib.h> 
+5

Đọc câu hỏi; anh ta đã đề cập thêm stdlib.h. Nhưng đó chỉ đủ tốt cho lối ra, không phải cho các hàm chuỗi. –

6

Tôi đã gặp các cảnh báo này trên chức năng mempcpy.Trang Man nói chức năng này là một phần mở rộng GNU và tóm tắt chương trình:

#define _GNU_SOURCE 
#include <string.h> 

Khi #define được thêm vào nguồn của tôi trước khi #include, tờ khai cho các phần mở rộng GNU được thực hiện có thể nhìn thấy và cảnh báo biến mất.

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