سؤال

ولدي مشروع يتكون من ملفين، main.c وlogoff.c. عندما أحاول جمعها أحصل على هذا الخطأ:

gcc -c -g -Wall main.c
gcc -c -g -Wall logoff.c
gcc -o main -g -Wall main.o logoff.o
ld: duplicate symbol _logoff in logoff.o and main.o

ولدي وظيفة اسمه الانقطاع في logoff.c، ولكن لقد بحثت main.c عن النص "تسجيل الخروج" ولقد وجدت شيئا (وظيفة ليست حتى أنه دعا بعد!).

إذا قمت بتغيير اسم وظيفة لlog_off يعمل. هناك وظيفة ثانية في الملف الذي يسبب ثم نفس الخطأ ما لم يتم تغيير اسمها كذلك.

هل هناك أي سبب لماذا يمكن أن يحدث هذا؟ لدي هذه المشكلة على نظامين مختلفين. الشيء الوحيد الذي قد تكون ذات صلة هو أنني استخدمت نفس الملف logoff.c في مشروع آخر لكنه ليس متصلا هذا واحد.

هل كانت مفيدة؟

المحلول

وإنشاء ملف logoff.h فقط مع إعلان وظيفة من الانقطاع، مثل

وvoid logoff(void);

وبعد ذلك، في main.c إدراجه مع #include "logoff.h". لا تشمل logoff.c، والمترجم وتجميع وظيفة مرتين، وسوف رابط نرى اثنين من وظائف هذا الاسم بعد ذلك.

ويبدو للعمل إذا كنت تغييره إلى log_off، ومن ثم إعادة ترجمة فقط واحد منهم. سوف الكائن ملف آخر لا تزال لديها وظيفة تسجيل الخروج من العمر جمعت فيها وهكذا رابط يرى log_off واحد وتسجيل الخروج واحدة. وهذا هو السبب يبدو للعمل لديك بهذا الاسم.

نصائح أخرى

هل # تضمين أو قم بإجراء #import logoff.c في main.c؟

وأنت فعلت - حسنا هناك مشكلتك. ويتم تضمينها logoff.c في main.c، لذلك يعرف الرئيسية _logoff و_main. الآن أيضا يمكنك ترجمة logoff.c، الذي يحدد _logoff. ثم حاولت وربط بين القضيتين، مما يعني أن ثنائي الناجمة يشمل الرموز _main، _logoff و_logoff، وهو بالضبط ما رابط أقول لك عنه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top