• 0
abshammeri

خطأ غريب . unresolved external symbol

سؤال

السلام عليكم :

حاولت سابقا ان اعمل كائنات في ملفات منفصلة واستدعيها .. كثيرا ما انجح .. لكن اواجه مشكلة


واعتقدت ان المشكلة مني ...

ولكن حاليا أملك كود من أحد المواقع ما علي الا ان اقوم بترجمته ..

قمت برتجمته ولكن ظهر نفس الخطأ مرة اخرى ..

بحثت في قوقل .. وجدت عدة حلول جربتها .. لكن ما نفعت معي ..

أحدها يقول :
غير من SINGLE THREAD الى MultiThread .. لكن ما نفع معي .
 

--------------------Configuration: CAMERA - Win32 Debug--------------------MAIN.OBJ : error LNK2001: unresolved external symbol "public: __thiscall L3DS::L3DS(void)" ([email protected]@[email protected])MAIN.OBJ : error LNK2001: unresolved external symbol "public: virtual __thiscall L3DS::~L3DS(void)" ([email protected]@[email protected])MAIN.OBJ : error LNK2001: unresolved external symbol "public: unsigned int __thiscall LMesh::GetTriangleCount(void)" ([email protected]@@QAEIXZ)Debug/CAMERA.exe : fatal error LNK1120: 10 unresolved externalsError executing link.exe.CAMERA.exe - 11 error(s), 0 warning(s)

اذا تريدون السورس كود أنزله .. لكن الكود كبير شوي في عدد الاسطر واكثر من ملف فقلت يمكن ما ينفهم بسرعة .


انتظركم يا اخوان .

تم تعديل بواسطه مصطفى 36a2
add some tags
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

14 إجابة على هذا السؤال .

  • 0

هذا الخطأ معناه أنه لا يوجد definition لهذه الدوال أي أنه تم التصريح عن وجودها بدون وجود كود خاص بها

L3DS::L3DS(void)
L3DS::~L3DS(void)
public: unsigned int __thiscall LMesh::GetTriangleCount(void)

و ممكن يكون الكود ناقص

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

هذا الخطاء يحدث فى مرحلة اللنك تاكد من وجود الملف obj الذى يحتوى على الدالة وتاكد من ان هذا اللملف مرفق ضمن الملفات التى يتم تحديدها تحت دالة الlink.

فى عملية الcompile يتم إنشاء ملفات obj وفى مرحلة الlink يتم دمج الملفات, يعنى يقوم كل ملف obj بالبحث عن الدوال المستخدمة فى المشروع فى احد ملفات الobj, إذا لم يعثر عليها يحدث خطاء link, لذلك يجب عليك ان تتاكد ان الدالة موجوده فى ملف من هذه الملفات..

والسلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اظن ناقصك ملفات lib

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المشكلة مثل ما يقول حسن , ولا تنسى الـ pragma

موضوع قديم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا يا اخوان .. المشكلة ليست في المكتبات .. كل المطلوب مكتبات opengl وهي مضمومة .

لكن أعتقد ان السر في ما قاله الاخ احمد غريب ,,

ملفات obj .. هي السبب .

فتحت مشروع جديد كليا .. وأعدت بناء المشروع وظهر لدي unresolved external واحد فقط .. هذه المرة .

لكن حذفت الدالة اللي صار عليها الخطأ ( مضطرا ) .. ومشى الحال .

والان التطبيق على خير ما يرام .. :) ,,

لكن المشكلة ان unresolved external .. دائما ما تظهر .. بدون داعي .. يعني لو اعيد بناء المشروع .. يطلع لي خطأ جديد .. ليس كالسابق ..

جزاكم الله خير .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته

مثل هذه الاخطاء تحدث معي عادة عندما استخدم متغير عام global عندها وعند عملية الربط تضهر مثل هذه الاخطاء

على سبيل المثال قمت قبل كتابة هذا الرد بتجربة هذا البرنامج البسيط وحصلة على رسالة الخطاء التالية:

/tmp/ccJHoqh2.o: In function `main':
main.cpp:(.text+0x122): undefined reference to `Result'
/tmp/ccNU2T3X.o: In function `input()':
input.cpp:(.text+0x11b): undefined reference to `Result'
collect2: ld returned 1 exit status

المصرف هو GCC 3.4.2

والبرنامج يتكون من أربع ملفات

1- ملف يحتوي على دالة التنفيذ الرئيسية ويسمى main.cpp

2- ملف يحتوي على دالة بسيطة للادخال ويسمى input.cpp وملفه الرأسي input.h

3- ملف يحتوي على متغير عام ويسمى global.h

وهذه هي الشفرة:

1- الملف main.cpp

#include<iostream>
using namespace std;

#include"input.h"
#include"global.h"


int main()
{
 input();
 cout<<"\nYou have entered:\t" << Result;

 return 0;
}

2- الملف input.h

#ifndef input_h
#define input_h

void input();

#endif

3- الملف input.cpp

#include<iostream>
using namespace std;
#include"input.h"
#include"global.h"

void input()
{
 cout<<"\nEnter any number:\t";
 cin>> Result;
}

4- الملف global.h

#ifndef global_h
#define global_h

extern unsigned int Result;

#endif

ارجوا ان تساعدوني على اكتشاف مثل هذه الأخطاء لتجنبها عند برمجة أي مشاريع كبيرة

وهذه في الحقيقة الغاية من جعل الكود بسيط

وشكراً لكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

:D

اكتشفت أن احد الاسباب عدم ربط المكتبة gluax ... معلش .: ) ,,

لكن هذه حلت خطأ واحد فقط ...

باقي الاخطاء لم يحلها الا اعادة الترجمة والمشروع كاملا ..

==

أعتقد كلام الاخ سلامة صحيح 100% ,,

انا ايضا لا تظهر معي مثل هذه الاخطاء الا عن التعامل مع متغيرات global..في ملفات اخرى ..

ارجوا ان تساعدوني على اكتشاف مثل هذه الأخطاء لتجنبها عند برمجة أي مشاريع كبيرة

وهذه في الحقيقة الغاية من جعل الكود بسيط

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

هل قمت بتجربة الكود الذي وضعته ؟؟؟؟ أرجوا تجربته من الأعظاء لمعرفة سبب خطأ الربط

مع أنني لا أجد اي خطاء فيه ؟؟

وشكراً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

معقولة ولا شخص حاول يترجم البرنامج .......... شيء مؤسف جداً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
السلام عليكم

هل قمت بتجربة الكود الذي وضعته ؟؟؟؟ أرجوا تجربته من الأعظاء لمعرفة سبب خطأ الربط

مع أنني لا أجد اي خطاء فيه ؟؟

وشكراً

السلام عليكم

الخطاء ناتج عن استخدام عبارة extern بدون تعريف المتغير الاصلى. بمعنى ان extern لا تكفى لتعريف متغير ولكن تعرف مرجع لذلك المتغير المعرف سلفاً فى مستوى scope اعلى او ملف اخر ويكفى اضافة العبارة unsigned int Result; فى اى من الملفات main.cpp أو input.cpp

http://msdn.microsoft.com/library/default....ue&hidetoc=true

وشكراً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

شكراً لك أخي PointerVC

لكن لم افهم قصدك تماماً ياليت لو تحاول ان تغير في الكود للتوضح اكثر

وحتى تعم الفائدة للجميع

وشكراً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخوي سلامة_2005

الكموبايلر يترجم ملفات cpp. ولا يترجم ملفات h. (( طيب هذه ملعومات قديمة :wacko: اصبر شوي ))

لما يجي يترجم الكموبايلر ملفات cpp. يترجم كل ملف لوحدة بشكل منفصل يعني بالعربي كل ملف ينتج منه

ملف object .

طبعا كل ملف obj. له متغيراته ودواله الخاصة به .

طيب نجي الحين للشغل المهم :D .

في عملية الربط بين ملفات obj. يوجد نوعان من الربط

1) ربط داخلي 2) ربط خارجي

الربط الدخلي يتم بين الدوال والمتغيرات اللي في نفس الملف

اما الربط الخارجي يتم بين الدوال والمتغيرات العمومية اللي في الملفات الأخرى

يعني أنت استدعيت دالة وتعريفها في ملف آخر مثال عليها دوال المكتبات تستخدمها في برنامجك رغم ان تعريفها

موجود في ملفات آخر .

طيب اذا كان كل ملف يترجم لوحده بدون ما يعرف محتويات الملفات الآخرى اذا كنت أبي استخدم دالة معرفة في ملف

آخر كيف استخدمها ؟ يعني هل توجد طريقة تخبر الكومبايلر ان هذه الدالة ليست في الملف نفسه حتى لا يعطيني رسالة خطأ ؟

نعم توجد طريقة وهذه الطريقة هي باستخدام الكلمة extern .

هذه الكلمة تخبر الكومبايلر انه توجد دالة او متغير عمومي في ملف آخر يجب ان تضمنها

والخطأ الذي وقعت فيه أنت انك اخبرت الكومبايلر انه يوجد متغير اسمه Result من نوع unsigned int

لكن في مرحلة الربط لم يجد الرابط ( linker) هذا المتغير لم يتم تعريفه اصلا لأنه يوجد فرق ما بين

unsigned int Result;

وهذا يتعبر تعريف وبين

extern unsigned int Result;

وهذا يعتبر تصريح

وتستطيع أن تقول مثلاً

unsigned int Result;
extern unsigned int Result;
extern unsigned int Result;
extern unsigned int Result;

لكن لا تستطيع أن تقول

unsigned int Result;
unsigned int Result;

واتمنى اني وضحت الغموض اللي في المشكلة لك وللأستاذ الشمري وأي استفسار أنا حاظر

والله الموفق :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً لك أخي b.m.s

لم اعرف بان المتغيرات العامة يجب ان نتعامل معها مثل الدوال

من حيث التصريح والأعلان

اذاً يجب ان استخدم ملف رأسي يحتوي على التصريح بالمتفير العام مثلاً global.h

extern unsigned int Result;

وملف سورس كود يحتوي على الاعلان عن المتغير العام مثلاً global.cpp

unsigned int Result;

شكراً لكم جميعاً

تم تعديل بواسطه سلامة_2005
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً لك أخي b.m.s و شكراً لك أخي سلامة_2005

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .