ספרייה משותפת

אורי שאל אותי איך להשתמש בספרייה משותפת בלינוקס אשר נכתבה בFPC עם תוכנה שכתובה בC.

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

אז כמה דגשים קטנים:

  • חשוב להשתמש ב cdecl בתור סדר טעינת הפרמטרים.
  • אסור להשתמש במשתנים כדוגמת מחלקות, מחרוזות, או שימוש במערך פתוח בין פרמטרים אחרים, אלא חשוב שהוא יהיה בסוף (בשביל שC יוכל להשתמש בו בתור va_arg).
  • חשוב להבין כיצד ספרייה מקושרת עובדת.
  • חשוב לזכור שאם משתמשים במשתנה שמעוניינים לייצא, צריך בין הייתר להכריז עליו בתור cvar.
  • בלינוקס מן הסתם צריך לזכור להדר את הספרייה שלנו בתור PIC.

אני בטוח שישנם עוד דגשים, אבל זה מה שכרגע עולה לי לראש.

אז איך אני יוצר ספרייה מקושרת בפסקל בכלל ובFPC בפרט ?

בואו ניצור את הספרייה sayhello:

library sayhello;
procedure helloworld; cdecl;
begin
writeln ('Hello World');
end;

exports
helloworld;

end.

כמו שניתן לראות, השורה הראשונה מתחילה עם library. כמו שאתם כבר מכירים, יש program ויש unit, כל "ראש" כזה, מסביר למהדר איך להתייחס לקוד בקובץ, ובנוסף זו גם ההגדרה שלנו למרחב שמות (name space). במקרה הזה, אנחנו אומרים לו ב"ראש" שזוהי ספרייה ולא "תוכנה".

הדבר הבא הוא לשים את הקוד שלנו, כאשר במקרה הזה, יצרנו שגרה בשם helloworld. וכמו שניתן לראות, סדר הפרמטרים שלה הוא cdecl.

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

 

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

השלב הבא, הוא להדר את הספרייה:

fpc -Cg sayhello.pp

כאשר האפשרות Cg- אומרת לייצר קוד PIC. חשוב להדגיש כי בגרסאות לפני 2.2.0 היו בעיות עם PIC, אך כיום הבעיה תוקנה. חשוב לזכור שלא תמיד צריך להגדיר PIC, בייחוד אם רוצים לשתף כתובות זכרון עם כל מי שמשתמש בשגרה.

הדבר הבא הוא או לשים את הספרייה במקום המתאים כדוגמת /usr/lib/ או להגדיר את המיקום תחת etc/ld.conf/, ובכל מקרה בסופו של דבר להריץ ldconfig בשביל שהספרייה תיכנס למאגר המיקומים של הספריות.

אחרי שאנחנו יכולים למצוא את הספריה שלנו כאשר נרצה להריץ קוד, ניצור קוד C:

exten void helloworld();
int main() {
helloworld();
return 1;
}

זהו ! עכשיו כל מה שנשאר זה להדר את הקוד C:

gcc testhello.c -o testhello -lsayhello -L ./

 

ואם הספריה באמת קיימת, כאשר נריץ את testhello, נקבל על המסך את הטקסט מהספרייה המשותפת.

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת /  לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת /  לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת /  לשנות )

מתחבר ל-%s

אתר זו עושה שימוש ב-Akismet כדי לסנן תגובות זבל. פרטים נוספים אודות איך המידע מהתגובה שלך יעובד.