كيفية بناء المكتبة التي تستخدم بعض البرنامج يعمل ؟

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

سؤال

أنا وضعت اثنين من C++ المكتبات منذ عدة سنوات التي كانت تستخدم من قبل ثلاثة مشاريع C++.لقد جمعت من المكتبات المكتبات المشتركة حتى لا تضطر إلى إعادة ترجمة/ربط البرنامج عند يبس تغيرت.أنا ترقية تجميع عملية CMake 3.0 ولكن أواجه مشكلة مع تجميع واحد.

هذه المكتبة لا توفر بعض الوظائف.زوجين من الوظائف يجب أن تكون محددة في البرنامج الرئيسي على الرغم من أنها تستخدم داخل المكتبة.والسبب هو أن تطبيقات هذه الوظائف تعتمد على برنامج البنية الداخلية.

حتى المكتبات جمعت مع رأس يعلن كل هذه الوظائف extern.هنا هو مثال قادمة من رأس إشكالية مكتبة:

extern char *  Get_Name(void *b);

أنا أعلن وظائف باستخدام extern الكلمات الرئيسية.بعد قراءة المزيد عن ذلك ، يبدو أن extern قد تكون زائدة عن الحاجة.

على x86_64 لينكس, لم يكن لدي أي مشكلة و تستخدم هذه المنظمة لسنوات.

ولكن الآن تجميع مكتبة فشل في OSX Mavericks (رنة:أبل LLVM الإصدار 5.1 (رنة-503.0.40) (على أساس LLVM 3.4 svn)).يمكن أن يكون مشكلة مع بلدي CMake الملفات أو أسوأ ، شاءت من OSX.المشكلة هي أنه عند ربط الوقت (عندما خلق .dynlib الملف) فإنه لا يمكن العثور على التعاريف من الوظائف.الخطأ المحدد هو:

cmake VERBOSE=1
[...]
Linking CXX shared library libtiming.dylib
/Applications/CMake.app/Contents/bin/cmake -E cmake_link_script CMakeFiles/timingShared.dir/link.txt --verbose=1
/usr/bin/c++   -dynamiclib -Wl,-headerpad_max_install_names   -o libtiming.dylib -install_name @rpath/libtiming.dylib <list of .o files> /Users/me/usr/lib/libone.dylib  -Wl,-rpath,/Users/me/usr/lib
Undefined symbols for architecture x86_64:
"Function_Name(void*)", referenced from:
[...]
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

أسئلتي هي:

  1. هل من الممكن C++ مكتبة استخدام الدالات التي تم تعريفها في البرنامج باستخدام المكتبة ؟
  2. ما هو خاص حول لينكس تجميع يسمح لي ثم العودة إلى تجميع .لذا مكتبة ديناميكية على الرغم من أن بعض الرموز غير محددة في الكائنات (فقط في البرنامج الرئيسي)?
  3. إذا كان من الممكن أفعل شيئا خاطئا مع CMake?هو الربط بين الأوامر أعلاه نشر فقط في عداد المفقودين شيئا ؟ يجب أن يكون باستخدام شيء مختلف عن "ربط" للحصول على المكتبة أحتاج ؟

شكرا لك.

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

المحلول 2

شكرا كريس Statton;كان علي أن أقول رابط تجاهل رموز غير في وقت الارتباط.

على OSX Mavericks ، رجل ld الدول:

 -undefined treatment
             Specifies how undefined symbols are to
             be treated. Options are: error, warning,
             suppress, or dynamic_lookup.  The
             default is error.

يمر -غير معروف dynamic_lookup أن عملية الربط مسألة حل القضية.

بالنسبة CMake, كان لي أن أضيف ما يلي بعد على add_library():

set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")

نصائح أخرى

جواب 1:
المكتبة قد حل الرموز التي تحتاج إلى حل.فإنها يمكن أن تحل في مكتبة أخرى أو البرنامج الخاص بك.

ومع ذلك ، المكتبات تحتاج إلى أن يعاد بناؤها من أجل معرفة ما وظائف البرنامج يحتوي على.حتى إذا مكتبة يحتاج إلى الوصول إلى وظيفة محددة في البرنامج ، فإنه يحتاج إلى أن يعاد بناؤها مع إعلان تلك الوظيفة.

في عام ، إذا كانت المكتبة استدعاء دالة خارج المكتبة ، أن المهمة لن تكون العالقة الرمز يجب أن تعلن في رأس الملف.

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