সতর্কতা: বিল্ট-ইন ফাংশন 'জাইজেড' এর বেমানান অন্তর্নিহিত ঘোষণা


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>

এই সতর্কতার সাথে যুক্ত সি ফাইলগুলির শীর্ষে নীচের পতাকাগুলি সংকলন করা ছাড়াও:

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

আমি জিসিসি ব্যবহার করছি 4.1.2:

$ gcc --version
gcc (GCC) 4.1.2 20080704

এই সতর্কতাগুলি সমাধান করার জন্য আমার কী করা উচিত?


5
আপনি ব্যর্থ যে কোড পোস্ট করতে পারেন?
এমকেবি

7
দুর্ভাগ্যক্রমে, আমার এই কোডটি পুনরায় পোস্ট করার অনুমতি নেই।
অ্যালেক্স রেনল্ডস

উত্তর:


271

সি-তে, পূর্বে অঘোষিত ফাংশনটি ব্যবহার করে ফাংশনের একটি অন্তর্নিহিত ঘোষণা গঠন করে। একটি অন্তর্নিহিত ঘোষণায়, intআমি সঠিকভাবে স্মরণ করিয়ে দিলে রিটার্নের ধরণটি হয় । এখন, জিসিসির কিছু স্ট্যান্ডার্ড ফাংশনগুলির জন্য অন্তর্নির্মিত সংজ্ঞা রয়েছে। যদি অন্তর্নিহিত সংজ্ঞাটি কোনও অন্তর্নিহিত সংজ্ঞাটির সাথে মেলে না তবে আপনি এই সতর্কতাটি পান।

সমস্যাটি সমাধান করার জন্য আপনাকে সেগুলি ব্যবহারের আগে তাদের কার্যাদি ঘোষণা করতে হবে; সাধারণত আপনি উপযুক্ত শিরোনাম অন্তর্ভুক্ত করে এটি করেন do আমি -fno-builtin-*সম্ভব হলে পতাকাগুলি ব্যবহার না করার পরামর্শ দিচ্ছি ।

পরিবর্তে Stdlib.h এর আপনার চেষ্টা করা উচিত:

#include <string.h>

সেখানেই strcpy এবং strncpy, সংজ্ঞায়িত করা হয় অনুযায়ী কমপক্ষে strcpy(2) মানুষ পাতা।

exitফাংশন সংজ্ঞায়িত করা হয় stdlib.h , যদিও, তাই আমি জানি না কি চলছে ওইখানে।


ধন্যবাদ, পরিষ্কার করার জন্য আমার কাছে প্রায় 20 .c ফাইল রয়েছে এবং কিছু শিরোনাম যোগ করা মিস করেছে।
অ্যালেক্স রেনল্ডস

ভার্চুয়ালাইজেশন ধরণের (জেন এইচভিএম / কেভিএম / ভিএমওয়্যার / বেয়ার মেটাল) চেক করার জন্য কোনও সি প্রোগ্রাম সংকলনের চেষ্টা করার সময় আমার সমস্যা সমাধান হয়েছে! ধন্যবাদ।
টেরি ওয়াং

16

কিছু প্রোগ্রামের ক্ষেত্রে, এই ত্রুটিগুলি স্বাভাবিক এবং এটি ঠিক করা উচিত নয়।

আমি প্রোগ্রাম ত্রুটি সংকলন করার সময় এই ত্রুটি বার্তা পেয়েছি (উদাহরণস্বরূপ)। এই প্রোগ্রামটিতে এমন কোড রয়েছে যা ফাংশনগুলিতে অন্তর্নির্মিত কিছু সংশোধন করে বা প্রতিস্থাপন করে এবং আমি যখন সতর্কতাগুলি ঠিক করার জন্য উপযুক্ত শিরোনাম ফাইলগুলি অন্তর্ভুক্ত করি তখন জিসিসি পরিবর্তে একগুচ্ছ ত্রুটি তৈরি করে। সুতরাং সতর্কতাগুলি ঠিক করা কার্যকরভাবে বিল্ডটিকে ভেঙে দেয়।

আপনি যদি এমন কোনও বিতরণের অংশ হিসাবে উত্স পেয়ে থাকেন যা সাধারণত সংকলন করা উচিত তবে ত্রুটিগুলি স্বাভাবিক হতে পারে। নিশ্চিত হওয়ার জন্য ডকুমেন্টেশনের সাথে পরামর্শ করুন।


10

এখানে কিছু সি কোড রয়েছে যা উপরে বর্ণিত ত্রুটি তৈরি করে:

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

ফেডোরা 17 লিনাক্স g৪ বিট-এ জিসিসি সহ এটি সংকলিত:

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 যোগ করার কথা উল্লেখ করেছেন। তবে এটি কেবল প্রস্থানের জন্য যথেষ্ট, স্ট্রিং ফাংশনগুলির জন্য নয়।
ম্যাট ফ্লেচার

7

আমি mempcpyফাংশনে এই সতর্কতাগুলি পূরণ করেছি । ম্যান পৃষ্ঠা বলছে যে এই ফাংশনটি একটি জিএনইউ এক্সটেনশন এবং সংক্ষিপ্তসার শোতে:

#define _GNU_SOURCE
#include <string.h>

#defineআমার উত্সটিতে যখন যুক্ত হওয়ার আগে #include, জিএনইউ এক্সটেনশনের জন্য ঘোষণাগুলি দৃশ্যমান করা হয় এবং সতর্কতা অদৃশ্য হয়ে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.