Logo

רד-בורד: ארכיון

ראשי > תיכנות > כמה שאלות בשפת C

12/10/2006 21:05:04 SlimShady
שלום, אני מתכנת בשפת C, ועכשיו התחלתי לקרוא על חלוקת פרוייקט לקבצים, MAKEFILE, וכאלה. אז יש לי כמה שאלות:
- קראתי שכשמחלקים פרוייקט למספר קבצים, אז כדי לקמפל את כולם צריך לכתוב פקודה כזאתי:
קוד:$ gcc -c -Wall f1.c
$ gcc -c -Wall f2.c
$ gcc f1.o f2.o -o app

(אם שני הקבצים הם f1 ו-f2)
אבל לפי מה שהבנתי אלה פקודות רק של יוניקס, וגם המהדר GCC הוא של יוניקס, אז מה אני עושה בוינדוס?

-לגבי ה-makefile - הרי כשאני יוצר פרוייקט הקובץ הזה לא נוצר מעצמו? אם כן אז למה לכתוב אותו לבד? וגם כשכותבים אותו ראיתי שמשתמשים בפקודה GCC אז שוב, מה אני עושה אם יש לי וינדוס?

- מה זה קובץ עם סיומת O ? חשבתי שמקוד מקור הקומפיילר מקמפל ישר לקובץ EXE, אבל אני רואה גם קבצי O , מה אלה בדיוק ומה עושים איתם?

- יש לי עוד בעיה- התחלתי ללמוד סוקטים מהמדריך הזה:
http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html
וניסיתי לקמפל את הקוד של ה-SERVER שם (יש אם את הקוד תחת הכותרת "SAMPLE CODE") ואני מקבל שגיאה:
C:\Tests\Project\Makefile.win [Build Error] [Project1.exe] Error 1
הוספתי כבר את הספרייה winsock32.lib.
ואני משתמש בקומפיילר DEV-CPP 4.9.9.2
14/10/2006 12:19:12 T4uSBaZ
לגבי הסוקטים:
אתה צריך לאתחל את ווינסוק ..
כפי שכתוב בדף ההקדמה
וגם לסגור אותו עם WSACleanup();
קיצר זה כתוב בדף ההקדמה..
ותוסיף את winsock.h

14/10/2006 18:25:50 SlimShady
איפה אתה רואה דף הקדמה? חיפשתי בספריות שם בדף שהבאתי פה ולא ראיתי שום דף הקדמה...
בכל אופן, אני לא יודע אם זה מה שהתכוונת, אבל הוספתי כבר קטע כזה בתחילת הפונקציה MAIN :
קוד:
WSADATA WSAData;

if (WSAStartup(MAKEWORD(2,2), &WSAData) != 0)
{
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}

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

---------------------------------
עריכה:
את הקוד שלך להבא תכניס לתוך (code)blabla(/code) רק עם סוגריים מרובעים...
(tal)[ההודעה נערכה על-ידי tal ב-14/10/2006 20:12:54]
14/10/2006 19:11:50 HLL
4. תגיד לנו מה השגיעה של המהדר, נתת פה רק את הסיכום ולא את הודעת השגיעה, אי אפשר לדעת מזה

3. קובץ .O הוא (לרוב) קובץ מהודר (קוד מכונה) אבל שלא עבר Linkage (שזה התפקיד של ld שבא עם ה GCC), כלומר הקוד הוא קוד מכונה, אבל אין לו כותרת של קובץ בר-הרצה, וגם הסמלים שמה (קריאות לפונ’, משתנים גלובאלים) עדיין נמצאים שמה בתור סמלים שצריכים לקשר אותם לאלמנטים אחרים בתוכנית (לשאר קבצי ה .O)

2.אם סביבת העבודה שלך מייצרת לך קובץ MakeFile, אז כן, אין שום צורך לכתוב אותו בעצמו.

1. לחלונות (אם אתה רוצה את GCC), מכיוון שה GCC הוא קוד פתוח יש לו הרבה פורטים לוינדוס, אם אתה רוצה של אחד מהם זה djgpp, יש עוד הרבה (גוגל איט)
14/10/2006 20:12:49 pitbull.
לגבי הסוקטים, אני מציע לך ללמוד מפה:
part 1 - http://www.exegesis.uklinux.net/gandalf/winsock/winsock1.htm
part 2 - http://www.exegesis.uklinux.net/gandalf/winsock/winsock2.htm
זה מתאים לווינדוס, וכתוב בצורה ברורה, זה לא יסבך אותך..
15/10/2006 16:48:15 SlimShady
ציטוט:4. תגיד לנו מה השגיעה של המהדר, נתת פה רק את הסיכום ולא את הודעת השגיעה, אי אפשר לדעת מזה

3. קובץ .O הוא (לרוב) קובץ מהודר (קוד מכונה) אבל שלא עבר Linkage (שזה התפקיד של ld שבא עם ה GCC), כלומר הקוד הוא קוד מכונה, אבל אין לו כותרת של קובץ בר-הרצה, וגם הסמלים שמה (קריאות לפונ’, משתנים גלובאלים) עדיין נמצאים שמה בתור סמלים שצריכים לקשר אותם לאלמנטים אחרים בתוכנית (לשאר קבצי ה .O)

2.אם סביבת העבודה שלך מייצרת לך קובץ MakeFile, אז כן, אין שום צורך לכתוב אותו בעצמו.

1. לחלונות (אם אתה רוצה את GCC), מכיוון שה GCC הוא קוד פתוח יש לו הרבה פורטים לוינדוס, אם אתה רוצה של אחד מהם זה djgpp, יש עוד הרבה (גוגל איט)

אתה מתכוון COMPILE LOG? הנה בדיוק עכשיו הסתכלתי, והנה מה שרשום:
Compiler: Default compiler
Building Makefile: "C:\Tests\Project\Makefile.win"
Executing make...
make.exe -f "C:\Tests\Project\Makefile.win" all
gcc.exe Untitled1.o -o "Project1.exe" -L"C:/Dev-Cpp/lib" -L"C:/Dev-Cpp/include" winsock32.lib libwsock32.a

gcc.exe: winsock32.lib: No such file or directory
gcc.exe: libwsock32.a: No such file or directory

make.exe: *** [Project1.exe] Error 1

Execution terminated

לפי מה שהבנתי חסרה הספרייה winsock32.lib . איפה אני משיג אותה? חיפשתי בגוגל ולא מצאתי להורדה. מה שכן קראתי איפה שהוא שהגרסה היותר מתקדמת של הספרייה הזאת זה ws2_32.lib אז מה עדיף?
והקובץ השני שחסר אני לא יודע מה זה בדיוק, מה זה סיומת a ?

-לגבי הקובץ O - אם כך אז למה לא נוצרים קבצי O גם בסתם תוכניות שאני מקמפל? למה דווקא כשאני מתחיל פרוייקט הם נוצרים?

- עכשיו בדיוק הורדתי והתקנתי CYGWIN, עם הקומפיילר GCC (אני מקווה לפחות) , אז פשוט לקמפל לפי מה שכתבתי למעלה?

pitbull. תודה על הקישור,אני אסתכל שם

[ההודעה נערכה על-ידי SlimShady ב-15/10/2006 16:50:12][ההודעה נערכה על-ידי SlimShady ב-15/10/2006 18:26:06]
15/10/2006 19:51:45 HLL
משום מה אני בספק שאתה יכול להשתמש ב GCC כדי לעשות Link לליברי של wsock32 ... ל GNU יש את הדרך משלו לעשות את זה , ואם אני לא טועה לא צריך להוסיף בעצמך את הLibs ...

Checkout beej socket tutorial:
http://www.geocities.com/uv1st/netguide-heb/
(יש גם באנגלית אם אתה מעדיף, גוגל איט)
16/10/2006 13:57:01 SlimShady
מה זתומרת אני לא אמור להוסיף את הספריות? אם אני לא מוסיף יש מלא הודעות שגיאה.
הנה הוספתי את הספרייה libwsock32.a שקיימת אצלי במהדר, וזה הוריד לי כמה שגיאות. ועדיין נשארו לי כמה. אז הוספתי את הספרייה - winsock32.lib , וירדו לי כל השגיאות, אבל אז אני רואה בקומפייל לוג שהיא בכלל לא קיימת אצלי, מוזר...
בכל אופן לא הבנתי כל כך מה אתה רוצה שאני אעשה, ומה זה בדיוק GNU?
את המדריך של ביג’ אני מכיר, ובהתחלה עבדתי לפיו, אבל גם כשניסיתי לקפמל משם קודים היו שגיאות. ובכלל זה מדריך מעפן, עדיף כבר את מה שאני הבאתי בהחלתה.
20/10/2006 20:06:51 HLL
אתה משעשע, אם אתה יודע לקרוא אנגלית
קוד:
gcc.exe: winsock32.lib: No such file or directory
gcc.exe: libwsock32.a: No such file or directory
אומר ששני הליבים האלה לא נמצאו (מה זה לאזעזל libwsock32???)
מה שאני אומר שכל ליב חיצוני שאתה מקשר אתה צריך לוודא שהוא אכן קיים בתיקיית ה lib...
אני לא בטוח שמהדר שפותח עבור לינוקס( ALSO KNOWN AS GNU) יכיר פרוצדורת של סוקטים של חלונות (למרות שזה סתם בגלל שהמוח שלי מסרב לקבל את זה, אני לא רואה סיבה טכנית למה שזה לא יעבוד)
21/10/2006 19:31:26 SlimShady
אין לי מושג מה משעשע אותך, אבל תאמין לי אני יודע לקרוא אנגלית. אולי לא הסברתי טוב, אבל התכוונתי שלאחר שהעליתי פה את הלוג, ניסיתי כמה דברים, ובסוף קשרתי לספרייה libwsock32.a כמו שצריך, ועכשיו הוא מזהה אותה( השמות של הספריות ב-DEV הם כולם מתחילים ב-LIB וזה השם של הספרייה מה אני יעשה). בכל אופן הסרתי את הספרייה השנייה winsock32.lib שבכלל לא הייתה קיימת אצלי, ולא שמתי לב לזה. כעת הנה הלוג כשאני מנסה לקמפל:
קוד:Compiler: Default compiler
Building Makefile: "C:\Tests\DevSocketProject\Makefile.win"
Executing make...
make.exe -f "C:\Tests\DevSocketProject\Makefile.win" all
gcc.exe -c Server.c -o Server.o -I"C:/Dev-Cpp/include"

gcc.exe Server.o -o "SocketProject.exe" -L"C:/Dev-Cpp/lib" ../../Dev-Cpp/lib/libwsock32.a

Server.o(.text+0x107):Server.c: undefined reference to `bzero’
Server.o(.text+0x1f7):Server.c: undefined reference to `bzero’
collect2: ld returned 1 exit status

make.exe: *** [SocketProject.exe] Error 1

Execution terminated

הוא לא מזהה את הפונקציה bzero. מה לעשות עכשיו?

ומה זתומרת אני לא יכול להשתמש בקומפיילר GCC? עובדה אני רואה פה בלוג רשום gcc.exe ובפקודות יוניקס בכללי. אז מה זה אם לא קומפיילר של GNU?[ההודעה נערכה על-ידי SlimShady ב-21/10/2006 19:34:21]
23/10/2006 13:05:57 HLL
אוקי, החכמתי... D;
בקשר לקומפיילר
Dev-CPP זוהי סביבת עבודה שפותחה לחלונות, מהדר הברירת המחדל שלה הוא GCC עבור Windows, כאשר ה GCC הוא קוד פתוח והיה בעבר מיועד ללינוקס בלבד(AKA GNU\LINUX), אז הוא הומר לחלונות.
בקשר לפונ’, אני אישית לא מכיר אותה (ואני חושב שאתה משתמש בתיעוד של סוקטים יותר אבל ממש יותר מידי ישן)
אבל גוגל מצא לי אותה, והנה לך Define שיכול להחליף אותה:
http://www.opengroup.org/onlinepubs/000095399/functions/bzero.html
24/10/2006 17:41:39 SlimShady
ניסיתי להכליל את strings כמו שרשום שם, לא עזר. ניסיתי גם להכליל את string כמו שרשום במקום אחר, גם לא עזר....
עמודים: 1