คำเตือน: การประกาศโดยนัยที่เข้ากันไม่ได้ของฟังก์ชันในตัว 'xyz'


164

ฉันได้รับคำเตือนจำนวนหนึ่งเมื่อรวบรวมไบนารีสองสาม:

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

เพื่อพยายามแก้ไขปัญหานี้ฉันได้เพิ่ม

#include <stdlib.h>

ที่ด้านบนของไฟล์ C ที่เกี่ยวข้องกับคำเตือนนี้นอกเหนือจากการรวบรวมด้วยแฟล็กต่อไปนี้:

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

ฉันใช้ GCC 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

ฉันควรทำอย่างไรเพื่อแก้ไขคำเตือนเหล่านี้


5
คุณช่วยโพสต์โค้ดที่ล้มเหลวได้ไหม?
mkb

7
น่าเสียดายที่ฉันไม่ได้รับอนุญาตให้โพสต์รหัสนี้อีกครั้ง
Alex Reynolds

คำตอบ:


271

ใน C การใช้ฟังก์ชันที่ไม่ได้ประกาศก่อนหน้านี้ถือเป็นการประกาศโดยนัยของฟังก์ชัน ในการประกาศโดยนัยชนิดส่งคืนคือintถ้าฉันจำได้อย่างถูกต้อง ตอนนี้ GCC มีคำจำกัดความในตัวสำหรับฟังก์ชั่นมาตรฐานบางอย่าง หากการประกาศโดยนัยไม่ตรงกับข้อกำหนดในตัวคุณจะได้รับคำเตือนนี้

ในการแก้ไขปัญหาคุณต้องประกาศฟังก์ชั่นก่อนใช้งาน โดยปกติคุณทำได้โดยใส่หัวข้อที่เหมาะสม ฉันขอแนะนำไม่ให้ใช้-fno-builtin-*ธงหากเป็นไปได้

แทนที่จะเป็นstdlib.hคุณควรลอง:

#include <string.h>

นั่นคือสิ่งที่strcpyและstrncpyถูกกำหนดอย่างน้อยตามstrcpyman page (2)

exitฟังก์ชั่นที่กำหนดไว้ในstdlib.hแม้ว่าดังนั้นผมไม่ทราบว่าสิ่งที่เกิดขึ้นที่นั่น


ขอบคุณฉันมีไฟล์ประมาณ 20 c เพื่อล้างและพลาดการเพิ่มส่วนหัว
Alex Reynolds

แก้ไขปัญหาของฉันเมื่อพยายามคอมไพล์โปรแกรม C เพื่อตรวจสอบประเภทการจำลองเสมือน (Xen HVM / KVM / VMware / Bare Metal) เยี่ยม! ขอบคุณ
เทอร์รี่วัง

16

ในกรณีของบางโปรแกรมข้อผิดพลาดเหล่านี้เป็นเรื่องปกติและไม่ควรได้รับการแก้ไข

ฉันได้รับข้อความแสดงข้อผิดพลาดเมื่อรวบรวม phrap ของโปรแกรม (ตัวอย่าง) โปรแกรมนี้มีรหัสที่แก้ไขหรือแทนที่ฟังก์ชั่นที่มีในตัวและเมื่อฉันรวมไฟล์ส่วนหัวที่เหมาะสมเพื่อแก้ไขคำเตือน GCC จะสร้างข้อผิดพลาดขึ้นมาแทน ดังนั้นการแก้ไขคำเตือนอย่างมีประสิทธิภาพจะทำลายการสร้าง

หากคุณมีแหล่งที่มาเป็นส่วนหนึ่งของการแจกจ่ายที่ควรรวบรวมตามปกติข้อผิดพลาดอาจเป็นเรื่องปกติ ศึกษาเอกสารประกอบเพื่อให้แน่ใจ


10

นี่คือรหัส C บางส่วนที่ทำให้เกิดข้อผิดพลาดดังกล่าวข้างต้น:

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

รวบรวมแบบนี้บน Fedora 17 Linux 64 บิตด้วย 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 $ 

หากต้องการให้คำเตือนหายไปให้เพิ่มการประกาศนี้ไปที่ด้านบนของไฟล์:

#include <stdlib.h>

6
อ่านคำถาม; เขาพูดถึงการเพิ่ม stdlib.h แล้ว แต่นั่นก็เพียงพอแล้วสำหรับทางออกไม่ใช่สำหรับฟังก์ชันสตริง
Matt Fletcher

7

ฉันได้พบกับคำเตือนเหล่านี้ในmempcpyฟังก์ชั่น หน้าคนบอกว่าฟังก์ชั่นนี้เป็นส่วนขยายของ GNU และบทสรุปแสดง:

#define _GNU_SOURCE
#include <string.h>

เมื่อ#defineเพิ่มลงในแหล่งข้อมูลของฉันก่อนหน้าการ#includeประกาศสำหรับส่วนขยาย GNU จะปรากฏให้เห็นและคำเตือนจะหายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.