كيف يمكنني تجميع وربط Gnatmake مع مكتبة ADA المشتركة؟

StackOverflow https://stackoverflow.com/questions/3902597

  •  29-09-2019
  •  | 
  •  

سؤال

أواجه مشكلة في تجميع مقدم الطلب مرة أخرى في مكتبة بائع الزهور. تبين أن لدي مشكلة أكبر مع Florist (نفس الخطأ ينتج عن كل من أحدث تنزيل Adacore GPL وإصدار 2009 في أرشيف Debian). يحتوي Plortist على بعض المشكلات ذات المستوى المنخفض ، لكن عندما أنظر من خلال الملفات التي تم إنشاؤها ، يبدو أنه يشمل Errno.h بشكل صحيح.

هذا ما يحدث عندما أقوم ببناء بائع الزهور:

GCC -4.4 -C -I/usr/share/ada/adainclude/florist demo.adb gcc -4.4 -c -i./ -i/usr/share/ada/adainclude/florist /adainclude/florist/posix.adb gcc-4.4 -c -i. 4.4 -c -i./ -i/usr/share/ada/adainclude/florist -i-/usr/share/ada/adainclud usr/share/ada/adainclude/florister -i- /usr/share/ada/adainclude/florist/posix-c.adb gcc-4.4 -c -i./ -i/usr/share/ada/adainclud i- /usr/share/ada/adainclude/florist/posix-implementation.adb posix-implementation.gpb: 45: 06: تحذير: "System.Interrupt_Management.portations" هي وحدة GNAT داخلية posix-simplementation.gpb: 45: 06: تحذير: استخدام هذه الوحدة غير قابلة للحمل ويعتمد على نسخ POSIX-ESTIVE.GPB: 47: 06: تحذير: "System.Soft_Links" هو وحدة gnat الداخلية posix-simplementation.gpb: 47: 06: تحذير: تحذير: تحذير: تحذير: استخدام هذه الوحدة غير قابلة للعمليات المحمولة ويعتمد على الإصدار GCC -4.4 -C -i./ -i/ u sr/share/ada/adainclude/florister -i- /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4 -c -i./ -i/usr/share/ada/adainclud /usr/share/ada/adainclude/florist/posix-permissions.adb gcc-4.4 -c -i./ -i/usr/share/ada/adainclud /posix -permissions -simplementation.adb gcc -4.4 -c -i. i/usr/share/ada/adainclude/florist -x demo.ali gnatlink demo.ali -o demoapp ./posix-emplementation مرجع غير محدد إلى `store_errno '. posix__implementation__raise_posix_error ': posix-simplementation.adb :(. text+0x234): مرجع غير محدد إلى `` fetch_errno './posix-ifmplementation.o: in function `posix__implementation__check__': posix-emplementation.adb :(. text+0x2e5): undered reference to` betch_errno './posix-emplement. -Implementation.adb :(. النص+0x313): مرجع غير محدد إلى `fetch_errno '. ". (.text+0xaef): مرجع غير محدد إلى `store_errno '. Application.O: في الدالة `posix__iMplementation__restore_signals_and_raise_posix_error ': posix-emplementation.adb :(. text+0xc88): undected ref erence to `fetch_errno '. (.text+0x2FEF): مرجع غير محدد إلى `__gnat_florist_uname '. `posix__version ': posix.adb :(. text+0x30a6): إشارة غير محددة إلى` __gnat_florist_uname'. ./posix.o: في الدالة `posix__host_to_network_byte_order ': posix.adb :(. text+0x4627): مرجع غير محدد إلى` c_htonl'. ): مرجع غير محدد إلى "C_Htons". t_byte_order__2 ': posix.adb :(. text+0x4670): مرجع غير محدد إلى `c_ntohs' ./posix-io.o `__gnat_florist_open './posix-io.o: in function` posix__io_or_create': posix-io /bin/gcc-4.4 gnatmake: فشل الارتباط. josh@mini10: ~/demo $ gnatbind -i/usr/share/ada/adainclude/floristr -i/usr/include demo josh@mini10: ~/demo $ gnatlink demo ./posix-edmplement.o: in `posix__mplement__blement__bet_ada_eror_eror_code ": posix-simplementation.adb :(. text+0x19e): مرجع غير محدد إلى` store_errno '. إلى "fetch_errno". : posix-simplementation.adb :(. text+0x2e5): إشارة غير محددة إلى `fetch_errno '. `fetch_errno". نص+0x332): مرجع غير محدد إلى "fetch_errno". `nosys_neg_one ': posix-simplementation.adb :(. text+0xaef): مرجع غير محدد إلى` store_errno'. إشارة غير محددة إلى `store_errno '. : posix.adb :( .o: في الدالة `posix__release ': posix.adb :(. النص+0x3049): مرجع غير محدد إلى` __gnat_florist_uname ". .adb :(. text+0x30a6): مرجع غير محدد إلى `__gnat_florist_uname '. : في الدالة `posix__host_to_network_byte_order ': posix.adb :(. text+0x4627): مرجع غير محدد إلى` c_htonl'. `c_htons '. النص+0x4670): مرجع غير محدد إلى "C_NTOHS". O: في الدالة `posix__io__oPen_or_create ': posix-io.adb :(. text+0xfca): مرجع غير محدد إلى` __gnat_florist_open' collect2: ld عاد 1 حالة خروج gnatlink: خطأ عند الاتصال/bin/gccc-4.4

يبدو أن هذا الخطأ شائع إذا كانت هناك مشكلة مع errno.h يتم تضمينها بشكل صحيح. ولكن بقدر ما أستطيع أن أقول من ملف POSIX-CC ، يبدو كل شيء صحيحًا. أي شخص لديه أي اقتراحات حول كيفية حل هذا؟ يبني ملف Make Flormist بشكل صحيح حتى لا أعرف من أين يأتي هذا.

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

المحلول

حسنًا ، اتضح أن هذا ألم كبير لكنني وجدته.

يتوفر ملزمة بائع الزهور كمكتبة مشتركة ومكتبة ثابتة (تم تثبيت كلاهما). تحتاج إلى الارتباط مع المكتبة لحل جميع المراجع (لا يمكنني أبدًا تجميع مصدر المكتبة في طلبي). بمجرد مرور الوسيطة لإخبار مرحلة التجميع حول المكتبة ، يجب عليك توفير ملفات .ads (على الأقل) لحلها.

انتهى الحل النهائي كونه هذا:

gnatmake -aI/usr/share/ada/adainclude/florist -aO/usr/lib/ada/adalib/florist demo.adb -largs -lflorist

-aI يوفر المسار إلى ملفات إعلانات المكتبة. -aO يوفر المسار إلى ملف المكتبة (في هذه الحالة) -lflorist لإخبارها بالمكتبة المشتركة ، كل هذا ... لكن تمريرها لن ينجح. عليك أن تضع أ -largs أمامه (للترجمة والرابط) من أجل تمرير مرحلة التجميع المعلمة! بدونها ، لا ترى تلك المراحل الحجة!

إذن أنت الجميع! من أجل ترجمة رمز الرابط وربطه مقابل مكتبة ADA المشتركة ضمن Linux (GCC) ، تحتاج إلى توفير رؤوس/مواصفات المكتبة ، وموقع المكتبة ، وحجة -libname جنبًا إلى جنب مع -largs لتمرير تلك الأماكن المناسبة!

أنا سعيد الآن. آمل أن يساعد هذا شخص آخر.

نصائح أخرى

هذا مثال بسيط على استخدام مشروع GNAT للبناء مع بائع الزهور. أفترض ذلك $ADA_PROJECT_PATH يشمل الدليل حيث florist.gpr تم تثبيته (في حالتي ، $HOME/local/lib/gnat).

برنامج العينة (لم أتمكن من العثور على أي عروض زهرية بسيطة على الويب ، هل هناك أي؟) ، في id.adb:

with POSIX.Process_Identification;
with Ada.Text_IO; use Ada.Text_IO;
procedure Id is
begin
   Put_Line (POSIX.To_String (POSIX.Process_Identification.Get_Login_Name));
end Id;

ملف المشروع (id.gpr) ، في نفس الدليل مثل id.adb:

with "florist";
project Id is
   for Main use ("id.adb");
   for Object_Dir use ".build_id";
   for Exec_Dir use ".";
end Id;

بناء مع

$ gnatmake -p -P id.gpr
object directory "/Users/simon/florist-gpl-2010-src/demo/.build_id" created for project id
gcc -c -I- -gnatA /Users/simon/florist-gpl-2010-src/demo/id.adb
gnatbind -I- -x /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali
gnatlink /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali -lflorist -o /Users/simon/florist-gpl-2010-src/demo/id

و اهرب:

$ ./id
simon

يبدو أن أخطاء ارتباط حديقة جميلة. شيء بين ملفات .H الخاصة بك ، وملفات كائن ADA ، ومكتبات الارتباط C لا تتزاوج تمامًا. من الصعب معرفة ماذا رغم ذلك.

أفضل رهان لك هو البحث عن مستخدمي بائع الزهور الآخرين الذين ربما واجهوا نفس المشكلة. صفحة مشروعهم على SourceForge هنا, ، ولكن يبدو أنه لم يكن نشطًا بشكل فظيع على مدار الـ 6 سنوات الماضية. نظرًا لأن الإصدار الأخير هناك قديم ، فقد تحتاج إلى برنامج مترجم (و OS؟) الذي كان قديمًا حتى يعمل معه. إيك.

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