cảnh báo: khai báo ngầm không tương thích của hàm tích hợp 'xyz'


164

Tôi nhận được một số cảnh báo khi biên dịch một vài nhị phân:

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>

ở đầu các tệp C được liên kết với cảnh báo này, ngoài việc biên dịch với các 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ể gửi mã không thành công?
mkb

7
Thật không may, tôi không được phép đăng lại mã này.
Alex Reynold

Câu trả lời:


271

Trong C, sử dụng hàm không được khai báo trước đó sẽ tạo thành một khai báo ngầm định của hàm. Trong một khai báo ngầm, kiểu trả về là intnếu tôi nhớ lại chính xác. Bây giờ, GCC đã có các định nghĩa tích hợp cho một số chức năng tiêu chuẩn. Nếu một tuyên bố ngầm không phù hợp với định nghĩa tích hợp, 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 chức năng 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 các tiêu đề thích hợp. Tôi khuyên bạn không nên sử dụng -fno-builtin-*cờ nếu có thể.

Thay vì stdlib.h , bạn nên thử:

#include <string.h>

Đó là nơi strcpystrncpyđược xác định, ít nhất là theo trang strcpy(2) man.

Tuy nhiên, exithàm được định nghĩa trong stdlib.h , vì vậy tôi không biết chuyện gì đang xảy ra ở đó.


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 đề.
Alex Reynold

Đã 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 vời! Cảm ơn.
Terry Wang

16

Trong trường hợp của một số chương trình, những 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 phrap chương trình (ví dụ). Chương trình này có chứa mã sửa đổi hoặc thay thế một số chức năng được tích hợp và khi tôi bao gồm các tệp tiêu đề thích hợp để sửa các cảnh báo, thay vào đó GCC sẽ 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ỡ các bản dựng.

Nếu bạn có nguồn là một phần của bản phân phối nê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.


10

Dưới đây là một số mã C tạo ra lỗi được đề cập ở trên:

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

Được biên dịch như thế này trên Fedora 17 Linux 64 bit với gcc:

el@defiant ~/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]
el@defiant ~/foo2 $ ./n 
el@defiant ~/foo2 $ 

Để cảnh báo biến mất, hãy thêm tuyên bố này vào đầu tệp:

#include <stdlib.h>

6
Đọc câu hỏi; anh ấy đã đề cập đến việc thêm stdlib.h. Nhưng điều đó chỉ đủ tốt cho lối ra, không phải cho các hàm chuỗi.
Matt Fletcher

7

Tôi đã gặp những cảnh báo về mempcpychức năng. Trang Man cho biết chức năng này là một phần mở rộng GNU và tóm tắt hiển thị:

#define _GNU_SOURCE
#include <string.h>

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.