هل لا يجوز إنشاء مكتبة ثابتة بدون وجود ملف .c فيها؟

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

  •  13-12-2019
  •  | 
  •  

سؤال

لدي ملفين -> fact.h و main.c في ال /home/snyp1/new مجلد. main.c لديه الوظيفة الرئيسية التي تستدعي fact(int x) وظيفة في fact.h.أنا أقوم بإنشاء .a الأرشفة باستخدام الأمر ar ->

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

أنا على أوبونتو 12.04.من فضلك اسمحوا لي أن أعرف ما هو الخطأ.(أيضًا، إذا لم أستخدم -L/.../new, ، سيقول gcc أنه لا يمكنه العثور على "fact"، ربما لأنه ليس موجودًا /usr/local/lib)

يحرر:حسنًا، لقد وجدت السبب.هذا يرجع إلى حقيقة أنني كنت أستخدمه fact.h لبناء fact.o ومن ثم وضعها في المكتبة، لم تكن تعمل كما هو متوقع.لذلك قمت الآن بتغييره إلى file.c ويعمل بشكل جيد الآن.كان يجب أن أقدم تلك المعلومات، أنا آسف.على الرغم من أنني لا أعرف لماذا يجب أن يظهر هذا النوع من المشاكل.أليس من الممكن إنشاء مكتبات بدون مكتبة واحدة على الأقل .c الملف فيه؟

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

المحلول

كنت أستخدم الحقيقة.h لبناء الحقيقة.o ثم وضعها في المكتبة، ولم تكن تعمل كما هو متوقع.

هل تقصد أنك كنت تجميع fact.h لانتاج fact.o?

إذا كان الأمر كذلك، فهذا لم يكن يفعل ما تتوقعه.عندما تستدعي gcc على ملف رأس ينتج رأسًا مترجمًا مسبقًا، لا ملف كائن.لذلك على الرغم من حصولك على ملف يسمى foo.o لم يكن ملف كائن صالحًا.لو كنت قد ركضت للتو gcc -c fact.h كان من الممكن أن ينتج رأسًا مترجمًا مسبقًا fact.gch, ، ولكن من المفترض أنك هربت gcc -c fact.h -o fact.o مما يؤدي إلى استدعاء الملف fact.o على الرغم من أنه لا يزال رأسًا مترجمًا مسبقًا. file fact.o لكان قد أظهر أن:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

كان من الممكن أن تجبر مجلس التعاون الخليجي على التعامل مع الملف كرمز C، وليس كرأس، عن طريق التشغيل gcc -x c -c fact.h -o fact.o (ال -x c يقول التعامل مع الإدخال كرمز C بدلاً من استنتاج النوع من امتداد الملف) ولكن ربما يكون من الأسهل والأقل إرباكًا تسمية ملفك بشكل صحيح بدلاً من محاولة تجميع رأس.

أليس من الممكن إنشاء مكتبات بدون وجود ملف .c واحد على الأقل فيها؟

إنهم بحاجة إلى ملف كائن واحد على الأقل (أي. .o file) ولكن لم يكن لديك كائن صالح، كان لديك رأس مترجم مسبقًا بشكل مضلل باسم .o, ، لكنه لم يكن في الواقع ملف كائن.

إذا لم أستخدم -L/.../new, ، سيقول gcc أنه لا يمكنه العثور على "fact"، ربما لأنه ليس موجودًا /usr/local/lib

الرابط لا ينظر فقط /usr/local/lib, ، هناك أماكن افتراضية أخرى تظهر فيها، لكن نعم، هذه هي المشكلة بالأساس.لاحظ أنه يمكنك أن تقول أيضا -L. إذا كانت المكتبة في الدليل الحالي، فهذا أسهل من إعطاء مسار مطلق.

نصائح أخرى

لست متأكد ar يدعم شرطة على أي شيء آخر غير الخيار الأول.يحاول

ar -rs libfact.a fact.o

أو فقط

ar rs libfact.a fact.o

انتبه، لا أعرف لماذا أركض ranlib لم تنجح بالرغم من ذلك.

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