জি ++ টাইপফর্মগুলির জন্য অপরিবর্তিত রেফারেন্স


208

আমি কেবল নিম্নলিখিত ত্রুটিটি পেরিয়ে এসেছি (এবং সমাধানটি অনলাইনে খুঁজে পেয়েছি, তবে এটি স্ট্যাক ওভারফ্লোতে উপস্থিত নেই):

(.gnu.linkonce। [স্টাফ]): [পদ্ধতি] [অবজেক্ট ফাইল] :(। gnu.linkonce। [স্টাফ]) - এর অনির্ধারিত উল্লেখ

কেন কেউ এই "টাইপফর্মের অপরিজ্ঞাত রেফারেন্স" লিঙ্কারের ত্রুটি পেতে পারেন?

(পর্দার আড়ালে কী চলছে তা যদি আপনি ব্যাখ্যা করতে পারেন তবে বোনাস পয়েন্টস))


31
আমি জানি এটি একটি পুরানো পোস্ট, তবে আমার আজ একই সমস্যা ছিল এবং সমাধানটি ছিল ভার্চুয়াল এবি () এর পরিবর্তে বেস ক্লাসে ভার্চুয়াল এবি () {as হিসাবে আমার ভার্চুয়াল ফাংশনটি সংজ্ঞায়িত করা; যা ত্রুটি দিয়েছে।
এনএভি

15
এখনও আরও ভাল হিসাবে virtual void abc() =0;(যদি বেস সংস্করণটি কখনও বলা হয় না)
Jul

3
@ নাভ: আপনি যদি এরূপ নির্ধারণ করেন তবে আপনি abc()সহজেই abc()উত্পন্ন শ্রেণিতে নতুন সংজ্ঞা দিতে ভুলে যেতে পারেন এবং ভাবতে পারেন যে সবকিছু ঠিক আছে, কারণ আপনি এখনও কোনও সমস্যা ছাড়াই ফাংশনটি কল করতে পারবেন। খাঁটি ভার্চুয়াল ফাংশন বাস্তবায়নের জন্য একটি ভাল অনুশীলন এই নিবন্ধে পাওয়া যায় এবং এটি হ'ল ফিউশনটি "খাঁটি ভার্চুয়াল ফাংশন বলে" এবং তারপরে প্রোগ্রামটি ক্র্যাশ করা।
হ্যালো গুডবাই

1
আমি একই ত্রুটি ছিল। আমি খুঁজে পেয়েছি যে "lib" রেফারেন্সের ক্রম পরিবর্তন করতে সহায়তা করতে পারে। আমি
ভিক্ষাবৃত্তি

2
গাহ। @ ধরদির মন্তব্যটি পড়তে এবং নিজেকে 'দোহ' বলার জন্য এই পৃষ্ঠায় ঠিক নেভিগেট করা এখনই কমপক্ষে দ্বিতীয় বার। কিছু পাগল আচরণ সন্ধান করার জন্য কেবল 45 মিনিট ব্যয় করেছি এবং আমার যা যা প্রয়োজন তা ছিল = 0;
ডোয়ান্ডারসন

উত্তর:


222

একটি সম্ভাব্য কারণ হ'ল আপনি কোনও ভার্চুয়াল ফাংশনটি সংজ্ঞায়িত না করেই ঘোষণা করছেন।

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

ভার্চুয়াল ফাংশন সংজ্ঞায়নের একটি উদাহরণ:

virtual void fn() { /* insert code here */ }

এই ক্ষেত্রে, আপনি ঘোষণার একটি সংজ্ঞা সংযুক্ত করছেন, যার অর্থ লিঙ্কারের পরে এটি সমাধান করার দরকার নেই।

লাইন

virtual void fn();

fn()এটি সংজ্ঞায়িত না করে ঘোষণা করে এবং আপনার সম্পর্কে জিজ্ঞাসা করা ত্রুটি বার্তার কারণ ঘটবে।

এটি কোডের সাথে খুব মিল:

extern int i;
int *pi = &i;

যা বলে যে পূর্ণসংখ্যাটি iঅন্য সংকলনের ইউনিটে ঘোষিত হয় যা অবশ্যই লিঙ্ক সময়ে সমাধান করা উচিত (অন্যথায় piএটির ঠিকানায় সেট করা যাবে না)।


28
এটি virtual void fn() = 0সংজ্ঞা হিসাবে বলা ভুল । এটি কোনও সংজ্ঞা নয়, একটি নিছক ঘোষণা । লিঙ্কারটি সমাধান করার চেষ্টা না করার একমাত্র কারণ হ'ল সংশ্লিষ্ট ভিএমটি এন্ট্রি কোনও ফাংশন বডিকে উল্লেখ করবে না (এতে সম্ভবত নাল-পয়েন্টার থাকবে)। যাইহোক, কেউ আপনাকে এই খাঁটি ভার্চুয়াল ফাংশনটিকে অ-ভার্চুয়াল পদ্ধতিতে, অর্থাত্ পুরোপুরি যোগ্যতাসম্পন্ন নাম ব্যবহার করে কল করতে বাধা দেয় না। এই ক্ষেত্রে লিঙ্কার দেহের সন্ধান করবে এবং আপনাকে ফাংশনটি সংজ্ঞায়িত করতে হবে। এবং হ্যাঁ, আপনি খাঁটি ভার্চুয়াল ফাংশনটির জন্য কোনও দেহ সংজ্ঞায়িত করতে পারেন
এএনটি

1
এবং কখনও কখনও একটি এমনকি একটি খাঁটি ভার্চুয়াল ফাংশন জন্য একটি শরীর ঘোষণা করতে হবে।
চিহ্নিত করুন

3
সংকলক (জি ++) আপনাকে অনুপস্থিত প্রতীকটি কী তা বলে দেবে। দ্রষ্টব্য: ডায়নামিক লাইব্রেরি লিঙ্কিংয়ের ক্ষেত্রে আপনি একটি ম্যাংলেড নাম পেতে পারেন। এটিকে পঠনযোগ্য আকারে পেতে c ++ ফিল্ট <চাঁদযুক্ত নাম পরিবর্তনযোগ্য> ব্যবহার করুন। কোনও বেস শ্রেণিতে ভার্চুয়াল ডেস্ট্রাক্টর বাস্তবায়ন অনুপস্থিত থাকায় শ্রেণীর নামের সাথে টাইপফোন ত্রুটিটি আমার ক্ষেত্রে ছিল।
chmike

1
প্রশ্নটিতে বিশেষভাবে উল্লেখ করা হয়েছে যে এটি টাইপফর্মটি অনুপস্থিত যা rtti এর সাথে জড়িত। মধ্যে Damon থেকে মন্তব্য দেখুন stackoverflow.com/questions/11904519/...
wilsonmichaelpatrick

1
@gbmhunter, যথেষ্ট ন্যায্য। পরিবর্তন করেছেন।
paxdiablo

149

আপনি মিশ্রণ -fno-rttiএবং -frttiকোড করার সময় এটিও ঘটতে পারে । তারপরে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে type_infoকোডটিতে অ্যাক্সেস করা কোনও শ্রেণি, -frttiতাদের কী পদ্ধতিটি সংকলন করেছে -frtti। শ্রেণীর কোনও অবজেক্ট তৈরি করা, ব্যবহার করা dynamic_castইত্যাদি এ জাতীয় অ্যাক্সেস ঘটতে পারে when

[ উত্স ]


20
তোমাকে অনেক ধন্যবাদ. এটি আমার সমস্যাটি 5 ঘন্টা অনুসন্ধানের পরে স্থির করেছে।
স্টিপেট

1
উত্স লিঙ্কটি মারা গেছে, এটি অবশ্যই permalink.gmane.org/gmane.comp.gcc.help/32475
গণিত

1
এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. মূল পৃষ্ঠাটি এখনও এখানে পাওয়া যায়: web.archive.org/web/20100503172629/http://www.pubbs.net/201004/…
সের্গেই বেলোজোরভ

3
আবার উদ্ধারে স্ট্যাকওভারফ্লো ডটকম! আমি আশা করি আমি একাধিকবার upvote করতে পারে। এক ঘন্টা কীবোর্ডে মাথা ঠেকানোর পরে আপনার উত্তরটি আমার যা প্রয়োজন তা ছিল।
স্পার্টিডব্লু

1
এন + 1 প্রাণ বাঁচিয়েছে এবং এখনও গণনা করছে :)
গ্যাব্রিয়েল

53

ঘোষিত (অ-খাঁটি) ভার্চুয়াল ফাংশনগুলি মৃতদেহগুলি হারিয়ে যাওয়ার পরে এটি ঘটে। আপনার শ্রেণীর সংজ্ঞায়, এরকম কিছু:

virtual void foo();

সংজ্ঞায়িত করা উচিত (ইনলাইন বা একটি লিঙ্কযুক্ত উত্স ফাইলে):

virtual void foo() {}

বা খাঁটি ভার্চুয়াল হিসাবে ঘোষণা করা হয়েছে:

virtual void foo() = 0;

27

জিসিসি ম্যানুয়াল থেকে উদ্ধৃতি :

পলিমর্ফিক ক্লাসগুলির জন্য (ভার্চুয়াল ফাংশন সহ ক্লাস), টাইপ_ইনফো বিষয়টিকে ভ্যাটেবলের সাথেও লেখা হয় [...] অন্যান্য সমস্ত ধরণের জন্য, আমরা টাইপ_ইনফো অবজেক্টটি যখন ব্যবহার করা হয় তখন তা লিখি: যখন একটি এক্সপ্রেশনটিতে 'টাইপড' প্রয়োগ করা হয়, কোনও বস্তু নিক্ষেপ করা, বা কোনও ক্যাচ ক্লজ বা ব্যতিক্রমের উল্লেখের ক্ষেত্রে উল্লেখ করা।

এবং সামান্য আগে একই পৃষ্ঠায়:

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

সুতরাং, এই ত্রুটিটি ঘটে যখন "কী পদ্ধতি" এর সংজ্ঞাটি অনুপস্থিত থাকে, অন্যান্য উত্তর ইতিমধ্যে উল্লিখিত রয়েছে।


2
আমার ক্ষেত্রে, আমার একটি বেস ক্লাস ছিল যা ঘোষণা করেছিল তবে খাঁটি ভার্চুয়াল নয় এমন ভার্চুয়াল পদ্ধতিগুলি সংজ্ঞায়িত করে নি। একবার আমি তাদের খাঁটি ভার্চুয়াল তৈরি করেছিলাম, যা আমি বোঝাতে চাইছিলাম, লিঙ্কারের ত্রুটিগুলি চলে গেল।
তাতিয়ানা রাচেভা

@ টাটিয়ানাচাচেভা ধন্যবাদ! লিঙ্কারের কাছ থেকে ত্রুটি প্রতিবেদন করা সহায়কের চেয়ে কম এবং বড় ইন্টারফেসের জন্য '= 0' এর অভাবটি মিস করা খুব সহজ; খাঁটি ভার্চুয়াল জন্য!
রোলস

20

যদি আপনি একজনকে অন্যজনের সাথে সংযুক্ত করে থাকেন তবে আরও একটি সম্ভাবনা জিসিসি বা জি ++ এর মধ্যে "-fvisibility = লুকানো" দিয়ে সংকলন করছে। উভয় .so ফাইলগুলি "-fvisibility = আড়াল" দিয়ে নির্মিত হয়েছিল এবং কী পদ্ধতিটি একইরকম না হলে ভার্চুয়াল ফাংশনটির অন্য রূপায়ণগুলির মতো হয়, তবে পূর্ববর্তীটির vtable বা typinfo দেখতে পাবেন না। লিঙ্কারের কাছে, এটি একটি প্রয়োগহীন ভার্চুয়াল ফাংশনের মতো দেখাচ্ছে (প্যাক্সডিয়াবলোর এবং সিডিলিয়ারির উত্তর হিসাবে)।

এই ক্ষেত্রে, আপনাকে অবশ্যই বেস শ্রেণীর সাথে দৃশ্যমানতার জন্য একটি ব্যতিক্রম করতে হবে

__attribute__ ((visibility("default")))

ক্লাস ঘোষণায়। এই ক্ষেত্রে,

class __attribute__ ((visibility("default"))) boom{
    virtual void stick();
}

অন্য একটি সমাধান অবশ্যই, "-fvisibility = গোপনে" ব্যবহার না করা। এটি সংকলক এবং লিঙ্কারের জন্য জিনিসগুলিকে জটিল করে তোলে, সম্ভবত কোড সম্পাদনের ক্ষতির দিকে the


1
বেজ ক্লাসটি যদি বিমূর্ত বা অব্যবহৃত হয় তবে কেবল অ-ভার্চুয়াল ফাংশন, সাধারণত কেবল কনস্ট্রাক্টর রফতানি (আনহাইড) করা দরকার না। উদ্ভূত অন্যদিকে ক্লাস, রপ্তানি করা যদি তারা ব্যবহার করা হয় না।
ক্রিস হুয়াং-লিভার

হ্যাকের মতো মনে হচ্ছে তবে এটি আমার দিকের লক্ষণগুলি সমাধান করেছে। ধন্যবাদ!
ম্যালাত

15

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

আপনি যদি এমন ক্লাসে কাজ করার জন্য টাইপ তথ্য চান যার জন্য আপনি সত্যিই কোনও ভার্চুয়াল ফাংশন চান না, তবে ডেস্ট্রাক্টর ভার্চুয়াল করুন।


2
আপডমডেড কারণ আমি মনে করি যে এটি নির্দিষ্ট ত্রুটি বার্তার কারণ হতে পারে বলে মনে হয় (অপরিজ্ঞাত পদ্ধতিগুলির সাধারণ ক্ষেত্রে বিপরীতে ...)
অ্যালিস্টায়ার

4
ভোটের উপর ভিত্তি করে অর্ডার পরিবর্তন হতে পারে বলে একটি বিষয় আমাকে এসওয়ের সাথে অভ্যস্ত করতে হয়েছিল "উপরে" উত্তরগুলি উল্লেখ করছে না। আমি সাধারণত এখন অন্য কোনও উত্তরগুলিকে উল্লেখ করি না কারণ সেগুলিও মুছে ফেলা যায়। আমার বিশ্বাস উত্তরগুলি একক হওয়া উচিত। আমি এখনও বিশিষ্টতার জন্য ব্যবহারকারীর নামগুলি উল্লেখ করি।
প্যাক্সডিয়াবল্লো

আপনি কোনও ভিটিবেল ছাড়াই টাইপড ব্যবহার করতে পারেন; জিসিসি ম্যানুয়াল থেকে উদ্ধৃতিগুলির জন্য আমার উত্তরটি দেখুন।
সিজারব

11

আমি এই ত্রুটিটিতে কয়েক ঘন্টা ব্যয় করেছি এবং অন্য উত্তরগুলি এখানে কী ঘটছে তা বুঝতে আমাকে সহায়তা করেছে, তারা আমার বিশেষ সমস্যাটি সমাধান করেনি।

আমি এমন একটি প্রকল্পে কাজ করছি যা উভয় clang++এবং ব্যবহার করে সংকলন করে g++। আমার ব্যবহারের সাথে কোনও লিঙ্কিং সমস্যা ছিল না clang++, তবে undefined reference to 'typeinfo forত্রুটিটি পেয়েছিলাম g++

গুরুত্বপূর্ণ পয়েন্ট: সাথে অর্ডার ম্যাটারগুলি লিঙ্কিং g++। আপনি যদি লাইব্রেরিগুলি তালিকাভুক্ত করেন তবে আপনি যাতে ক্রমটি সঠিকভাবে যুক্ত করতে চান যা typeinfoত্রুটি পেতে পারেন ।

অর্ডার / / এর সাথে লিঙ্কিং সম্পর্কিত আরও তথ্যের জন্য এই এই প্রশ্নটি দেখুন ।gccg++


ধন্যবাদ!!! আমি এই ত্রুটিটি কেন পাচ্ছিলাম তা জানার চেষ্টা করার জন্য আমি একাধিক দিন অতিবাহিত করেছি এবং আমি এই উত্তর এবং আপনি যেটির সাথে লিঙ্ক করেছেন তার দেখা না পাওয়া পর্যন্ত কিছুই কার্যকর হয়নি। অনেক ধন্যবাদ!!
আইরিন

10

আরটিটিআই এবং নন-আরটিটিআই গ্রন্থাগারগুলির সাথে সম্পর্কিত কোডের সম্ভাব্য সমাধান:

ক) -ফ্রটি বা -ফনো-আরটিআই দিয়ে সমস্ত কিছু পুনরায় কম্পাইল করুন
খ) যদি ক) আপনার পক্ষে সম্ভব না হয় তবে নীচের চেষ্টা করুন:

ধরে নিন লিবিফু আরটিটিআই ছাড়াই নির্মিত। আপনার কোডটি libfoo ব্যবহার করে এবং আরটিটিআই সহ সংকলন করে। আপনি যদি ভার্চুয়ালগুলি সহ লাইবফুতে একটি ক্লাস (ফু) ব্যবহার করেন তবে আপনি সম্ভবত একটি লিঙ্ক-টাইম ত্রুটিতে চলে যেতে পারেন যা বলে: ক্লাস ফু এর জন্য টাইপিংফোন অনুপস্থিত।

অন্য শ্রেণীর সংজ্ঞা দাও (যেমন FooAdapter) যার কোনও ভার্চুয়াল নেই এবং আপনার ব্যবহৃত ফোগুলিতে কল ফরোয়ার্ড করবে।

একটি ছোট স্ট্যাটিক লাইব্রেরিতে FooAdapter সংকলন করুন যা আরটিটিআই ব্যবহার করে না এবং কেবল লিফু প্রতীকগুলির উপর নির্ভর করে। এটির জন্য একটি শিরোনাম সরবরাহ করুন এবং এটি আপনার কোডের পরিবর্তে (যা আরটিটিআই ব্যবহার করে) ব্যবহার করুন। যেহেতু FooAdapter এর কোনও ভার্চুয়াল ফাংশন নেই এতে কোনও টাইপইনফো থাকবে না এবং আপনি আপনার বাইনারি লিঙ্ক করতে সক্ষম হবেন। আপনি যদি লাইবফু থেকে প্রচুর বিভিন্ন ক্লাস ব্যবহার করেন তবে এই সমাধানটি সুবিধাজনক হতে পারে না তবে এটি একটি শুরু a


এটি আমার জন্য, বিভিন্ন আরটিটিআই সেটিংস সহ একটি লাইব্রেরির সাথে সংযুক্ত করে।
মার্শ

6

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

আমি এই সমস্যাটি সাইগউইনে তৈরি করে এবং তারপরে লিনাক্সে কোড পোর্টিং করেছি। মেক ফাইল, ডিরেক্টরি কাঠামো এবং এমনকি জিসিসি সংস্করণ (৪.৮.২) উভয় ক্ষেত্রেই অভিন্ন, তবে কোডটি লিঙ্কযুক্ত এবং সাইগউইনে সঠিকভাবে পরিচালিত হয়েছিল তবে লিনাক্সের সাথে লিঙ্ক করতে ব্যর্থ হয়েছিল। রেড হ্যাট সাইগউইন স্পষ্টতই সংকলক / লিঙ্কার পরিবর্তন করেছেন যা অবজেক্ট কোডের লিঙ্কিংয়ের প্রয়োজনীয়তা এড়ায়।

লিনাক্স লিঙ্কারের ত্রুটি বার্তাটি সঠিকভাবে আমাকে ডায়নামিক_কাস্ট লাইনে পরিচালিত করেছিল, তবে এই ফোরামে থাকা পূর্ববর্তী বার্তাগুলি আমাকে আসল সমস্যাটির পরিবর্তে ফাংশন বাস্তবায়নের জন্য: হারিয়ে যাওয়া অবজেক্ট কোডটি খুঁজছিল। আমার কাজের ভিত্তিটি ডাইনামিক_কাস্ট ব্যবহার না করে বেস এবং উত্পন্ন ক্লাসে ভার্চুয়াল টাইপ ফাংশনটি প্রতিস্থাপন করা ছিল, যেমন ভার্চুয়াল ইনট ইস্পেশিয়াল টাইপ ()। এই কৌশলটি সঠিকভাবে কাজ করার জন্য গতিশীল_কাস্ট পেতে অবজেক্ট বাস্তবায়ন কোডটি লিঙ্ক করার প্রয়োজনীয়তা এড়িয়ে চলে।


5

বেস ক্লাসে (একটি বিমূর্ত বেস বর্গ) আপনি একটি ভার্চুয়াল ডেস্ট্রাক্টর ঘোষণা করেন এবং আপনি যেমন কোনও ডেস্ট্রাক্টরকে খাঁটি ভার্চুয়াল ফাংশন হিসাবে ঘোষণা করতে পারেন না, তবে আপনাকে এটি ঠিক এখানে বিমূর্ত শ্রেণিতে সংজ্ঞায়িত করতে হবে, ভার্চুয়াল ~ বেসের মতো একটি ডামি সংজ্ঞা ( ) {do করবে, বা প্রাপ্ত কোনও শ্রেণিতে in

আপনি যদি এটি করতে ব্যর্থ হন, আপনি লিঙ্ক সময় একটি "অপরিবর্তিত প্রতীক" সমাপ্ত হবে। যেহেতু ভিএমটির সাথে মিলিত NULL এর সাথে সমস্ত খাঁটি ভার্চুয়াল ফাংশনগুলির জন্য এন্ট্রি রয়েছে কারণ এটি উত্পন্ন শ্রেণীর প্রয়োগের উপর নির্ভর করে টেবিলটি আপডেট করে। তবে অ-খাঁটি কিন্তু ভার্চুয়াল ফাংশনগুলির জন্য, এটির সংযোগের সময় সংজ্ঞা প্রয়োজন যাতে এটি ভিএমটি সারণি আপডেট করতে পারে।

প্রতীকটি ডিমেং করতে সি ++ ফিল্ট ব্যবহার করুন। যেমন $ সি ++ ফিল্ট _ZTIN10 স্টোরেজপী 8 ব্যাসহোস্টE "স্টোরেজপি: টাইপফর্ম :: বেসহোস্ট" এর মতো কিছু আউটপুট দেয়।


3

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

সমাধানটি ছিল নতুন সিপিপি ফাইলটি সংকলন করতে এবং লিঙ্ক করার জন্য বিল্ড সিস্টেমটি পুনরায় চালানো।


3

আমার ক্ষেত্রে, আমি শিরোনাম ফাইল এবং তাই ফাইল সহ একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করেছি। আমি একটি শ্রেণি সাবক্লাস করেছি এবং আমার সাবক্লাসটি ইনস্ট্যান্ট করার চেষ্টা করার সময় এই জাতীয় লিঙ্ক ত্রুটি ঘটেছে।

@ সার্জি দ্বারা উল্লিখিত হিসাবে, এটি 'আরটিটি'র সমস্যা হতে পারে তা জেনেও আমি কনস্ট্রাক্টর প্রয়োগটি পৃথক .cpp ফাইলে রেখে "-fno-rtti" ফাইলটি সংকলিত ফ্ল্যাগ প্রয়োগ করে এটির কাজটি পরিচালনা করতে সক্ষম হয়েছি । এটা ভাল কাজ করে.

যেহেতু আমি এখনও এই লিঙ্ক ত্রুটির অভ্যন্তরীণ সম্পর্কে পুরোপুরি পরিষ্কার নই, আমার সমাধানটি সাধারণ কিনা তা আমি নিশ্চিত নই। যাইহোক, @ ফ্র্যাঙ্কোইস দ্বারা উল্লিখিত হিসাবে অ্যাডাপ্টার উপায়ে চেষ্টা করার আগে আমি এটি শট করার পক্ষে বলে মনে করি। এবং অবশ্যই, যদি সমস্ত উত্স কোডগুলি উপলভ্য থাকে (আমার ক্ষেত্রে নয়), সম্ভব হলে '-frtti' এর সাথে আরও ভালভাবে পুনরায় কম্পাইল করুন।

আরও একটি বিষয়, আপনি যদি আমার সমাধানটি চেষ্টা করে বেছে নেন, পৃথক ফাইলটিকে যথাসম্ভব সহজ করার চেষ্টা করুন এবং সি ++ এর কয়েকটি অভিনব বৈশিষ্ট্য ব্যবহার করবেন না। বুস্ট সম্পর্কিত বিষয়গুলিতে বিশেষ মনোযোগ দিন, কারণ এর বেশিরভাগই আরটিটির উপর নির্ভর করে।


2

আমার ইন্টারফেসের (সমস্ত খাঁটি ভার্চুয়াল ফাংশন সহ) আরও একটি ফাংশন প্রয়োজন হলে আমি একই ত্রুটি পেয়েছি এবং আমি এটি "নাল" করতে ভুলে গিয়েছি।

আমার ছিল

class ICommProvider { public: /** * @brief If connection is established, it sends the message into the server. * @param[in] msg - message to be send * @return 0 if success, error otherwise */ virtual int vaSend(const std::string &msg) = 0; /** * @brief If connection is established, it is waiting will server response back. * @param[out] msg is the message received from server * @return 0 if success, error otherwise */ virtual int vaReceive(std::string &msg) = 0; virtual int vaSendRaw(const char *buff, int bufflen) = 0; virtual int vaReceiveRaw(char *buff, int bufflen) = 0; /** * @bief Closes current connection (if needed) after serving * @return 0 if success, error otherwise */ virtual int vaClose(); };

শেষ ভ্যাক্লোজ ভার্চুয়াল নয় তাই সংকলিত জানেন না যে এর জন্য বাস্তবায়ন কোথায় পাওয়া যায় এবং এর ফলে বিভ্রান্ত হয়ে পড়ে। আমার বার্তাটি ছিল:

... টিসিপিসিলেট.ও :(। রডাটা + 0x38): IC আইকোমপ্রভাইডারের জন্য টাইপফিনফোর'এর অপরিবর্তিত রেফারেন্স

থেকে সহজ পরিবর্তন

virtual int vaClose();

প্রতি

virtual int vaClose() = 0;

সমস্যা সমাধান। আশা করি এটা সাহায্য করবে


1

আমি এমন একটি পরিস্থিতির মুখোমুখি হলাম যা বিরল, তবে এটি অন্যান্য বন্ধুদের অনুরূপ পরিস্থিতিতে সহায়তা করতে পারে। আমাকে জিসিসি ৪.৪..7 সহ একটি পুরানো সিস্টেমে কাজ করতে হবে। আমাকে সি ++ 11 বা উপরে সমর্থন সহ কোডটি সংকলন করতে হবে, তাই আমি জিসিসি 5.3.0 এর সর্বশেষ সংস্করণটি তৈরি করি। আমার কোডটি তৈরি করার সময় এবং নির্ভরতাগুলির সাথে লিঙ্ক করার সময় যদি নির্ভরতা পুরানো সংকলক দিয়ে তৈরি করা হয়, তবে আমি 'এলএফ / পাথ / টু / লিবি -লিবি'র সাথে সংযোগের পথটি স্পষ্টভাবে সংজ্ঞায়িত করেও তবুও' অপরিবর্তিত রেফারেন্স 'পেয়েছি। কিছু প্যাকেজ যেমন বুস্ট এবং প্রকল্পগুলি চতুরের সাহায্যে বিল্ড হয় সাধারণত পুরানো সংকলকটি ব্যবহার করার প্রবণতা থাকে এবং এগুলি সাধারণত এ জাতীয় সমস্যা তৈরি করে। তারা আরও নতুন সংকলক ব্যবহার করেছেন তা নিশ্চিত করার জন্য আপনাকে অনেকদূর যেতে হবে।


1

আমার ক্ষেত্রে ডায়নামিক_কাস্ট থাকলেও এটি নিখুঁতভাবে একটি লাইব্রেরি নির্ভরতা ইস্যু। মেকফাইলে যথেষ্ট নির্ভরতা যুক্ত করার পরে এই সমস্যাটি চলে গেল।


0

আপনার নির্ভরতা ছাড়াই সংকলন করা হয়েছে তা পরীক্ষা করুন -f-nortti

কিছু প্রকল্পের জন্য আপনাকে এটিকে সুস্পষ্টভাবে সেট করতে হবে যেমন রকসডিবিতে:

USE_RTTI=1 make shared_lib -j4

0

আমার ক্ষেত্রে এটি একটি ইন্টারফেস শ্রেণিতে ভার্চুয়াল ফাংশন ছিল যা খাঁটি ভার্চুয়াল হিসাবে সংজ্ঞায়িত হয়নি।

class IInterface
{
public:
  virtual void Foo() = 0;
}

আমি = 0কিছুটা ভুলে গেছি ।

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