עבור לתוכן

עזרה בסי: main.c:(.text+0x7f): undefined reference to `deploySubs'

Featured Replies

פורסם

היי,

אני נתקל בשגיאת הקומפילציה הזו ואין לי מושג מדוע זה קורה..

אגב, לפונקציה deploySubs יש include בקובץ main.

אשמח לקבל עזרה.

תודה

פורסם

הבעיה היא לא של הקומפיילר, אלא של הלינקר (linker).

אני מניח שהפונקציה המדוברת יושבת בקובץ c נפרד מה-main. הקומפיילר מקמפל כל אחד מהקבצים הללו לקובץ o (או obj) ולאחר מכן הלינקר מקשר בין הקבצים ויוצר קובץ exe אחד. הבעיה היא שהלינקר כנראה לא יודע לקשר בין שני הקבצים המקומפלים (כלומר הוא מקבל כקלט רק את קובץ ה-main), ולכן הוא צועק שהוא לא מוצא את המימוש של הפונקציה deploySubs.

מה מבנה הפרוייקט שלך? באיזו סביבה אתה עובד ואיך אתה מקמפל?

פורסם
  • מחבר

אני משער שאתה צודק, כי קובץ הMakeFile יוצר לי קבצי Object ונכשל ביצירת קובץ ההרצה.

התכנית נכתבה בVS, עובדת תקין בVS תחת חלונות כמובן.

עכשיו אני מעביר אותה לסביבת לינוקס (מריץ לינוקס עם Vbox) ואתה צודק הכל מתקמפל ונכשל בלינקר. (אפילו בDev++ הוא אומר שגיאת לינקר).

קימפלתי קובץ קובץ ע"י פתיחת shell והרצת השרה gcc -c *.c

או לחלופין ע"י makefile ופקודת make.

חוץ מקובץ main יש עוד שני קבצי source ועוד שני headers, בהתאמה.

אילו עוד נתונים אתה צריך?

פורסם

הארגומנט c- אומר רק לקמפל, בלי ללנקג'.

אחרי שאתה מקמפל ככה אתה צריך שוב להריץ קומפילציה עם קבצי ה-o שיצאו לך, יענו ככה:

gcc -o myprog *.o

הארגומנט o- אומר מה יהיה שם קובץ הרצה של התכנית (במקרה הזה myprog).

פורסם
  • מחבר

אני יודע, כפי שכתבתי, אני משתמש בקובץ makeFile שכבר עושה קימפול+לינקור.

עדיין לא ברור לי למה זה נכשל בלינקר..

מישהו?

פורסם

תעלה לכאן את ה-makefile שלך.

חוץ מזה, תוודא שהשם של הפונקציה בקובץ ה-h ובקובץ ה-c הוא אותו שם בדיוק.

פורסם
  • מחבר

הנה קובץ הmakeFile [מצורף].

רק חידוד ברשותכם - גם כשניסיתי לעשות קישור ידני ע"י שורת הפקודה:

gcc *.o *.o *.o -o Prog

זה לא עבד, יש כאן משהו שאני לא תופס..

[attachment deleted by admin]

פורסם

אין שום סיבה לעשות שלוש פעמים o.*

אצלך ה-makefile יושב כולו בשורה אחת, או שזה רק משהו שנדפק בהעלאה של הקובץ לאתר? כי חוץ מהירידות שורה (והזחות) הוא נראה תקין.

איפה מוגדר deploySubs ואיפה הוא ממומש?

פורסם
  • מחבר

לא, הוא לא בשורה אחת זה נדפק בהעלאה כנראה..

הפונקציה deploySubs ממומשת בקובץ board.c והחתימה שלה נמצאת ב- board.h.

פורסם
  • מחבר

זו התכנית כולה [מצורפת].

מקווה שתוכל לעזור לי... :-\

נ.ב. - מבחינה סינטקסטית אני מאמין שהכל תקין, כי התכנית עובדת בVS.

[attachment deleted by admin]

פורסם

ב-board.h ו-board.c הצהרת ומימשת שתי פונקציות בשם deploySubs1 ו-deploySubs2, אבל ב-main אתה משתמש בפונקציה בשם deploySubs (הקומפיילר היה אמור לתת לך אזהרה על זה שהשתמשת בפונקציה שלא הוגדרה בכל, כי אמנם זה תקני לפי תקן C90, אבל זה לא נהוג והחל מ-C99 זה כבר לא תקני).

מומלץ, אגב, להוסיף לשורות הקומפילציה את הדגל Wall- שאומר לו להציג לך את כל האזהרות.

פורסם
  • מחבר

וואי לא מאמין שלא שמתי לב לזה...

תודה שניצל!!!!!

:yelclap:

פורסם

אמרתי לך לוודא שהשם של הפונקציה נכון בכל הקבצים...

פורסם
  • מחבר

אמת.

התכנית עברה כמה שינויים כשנויידה לcentOS לכן פיספסתי את הנתון הזה.

יש לי עוד שאלה בבקשה:

הגעתי לשלב בתכנית שהכל תקין בwindows, התכנית מבצעת את המוטל עליה.

בלינוקס הכל עובר קימפול + לינקור אך קובץ הפלט יוצא ריק.

אז מצד אחד אין לי מה לדבג בwindows כי הכל עובד שם חלק. מצד שני אני לא יודע מה לבדוק בלינוקס כי אין הודעות שגיאה ואפילו לא אזהרות...

האם קיימת סביבת פיתוח נוחה כדוגמת VS שאוכל להפעיל על הלינוקס?

אני פשוט חייב לדבג בצורה נוחה (ולא בטקסט אדיטור של הלינוקס!) עם break points וסטפ ביי סטפ.

תודה

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים