ما هي أفضل طريقة للكشف عن تبعيات المكتبة في مشروع C/C ++؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة للكشف عن تبعيات المكتبة في مشروع C/C ++؟

لدي مشروع حيث لدي جميع التبعيات على الجهاز. إنه يبني ويدير. الآن أريد أن أضع نظام بناء Autotools. أبحث عن طريقة جيدة للكشف عن جميع التبعيات اللازمة مثل ملفات الرأس المستخدمة والمكتبات اللازمة للربط.

يبدو أن بت المكتبة هي الأصعب بالنسبة لي لمعرفة ذلك. أود أن أكون قادرًا على القول ، إنشاء أوامر AC_CHECK_LIB لكل وظيفة في قائمة أو شيء من هذا القبيل. ربما كان بإمكاني القيام بذلك في بيرل ، لكن يجب أن أتخيل أنه موجود بالفعل في مكان آخر.

ما أعرفه هو أنه يمكنني عرض الرموز مع OBJDump و NM ، يمكنني العثور على المكتبة التي تنتمي إليها الوظيفة مع هذه النشاطات ، ثم يمكنني إدخال أمر AC_CHECK_LIB يدويًا في تكوينه. AC للتحقق من ذلك. الأتمتة ستكون رائعة في هذه المرحلة.

شكرا ، تشينز

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

المحلول

هذا النوع من الاختبارات الشاملة (أي كل وظيفة) غير ضروري. ناهيك عن أنه سيكون من الصعب الحفاظ عليها وتستغرق بعض الوقت للركض.

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

نصائح أخرى

واجهت تحديًا مشابهًا الآن. AutoConf ليس في الحقيقة مفيدة للغاية بالنسبة لحيل C ++ ، ولكن لديها طوب أساسي لبناء الوظائف في الأعلى. اقتراحاتي بعد النظر هنا وهناك:

  • اقرأ هذه المقالة, ، سوف يجلب لك أفكار جديدة
  • انظر إلى مصادر وحدات الماكرو Autoconf في AC-Archive (يتم تضمينه في Debian ، حتى تتمكن من استخدامه كما هو)
  • أنا شخصياً كتبت مساعد بسيط ، يتم نسخه من AC_CHECK_LIB و AX_CXX_CHECK_LIB. نعم ، تحتاج إلى كتابة برنامج اختبار صغير ، ولكن هذا يتيح لك اختبار الأنواع والفئات (sizeof قد تعمل ، ولكن ماذا عن المُنشئين؟) ، وظائف مضمنة (لا يمكنك القيام بمساعدة الرابط) والوظائف الخارجية (لا يمكنك القيام بذلك nm).

من عند aclocal.m4:

# SYNOPSIS
#
# AX_TRY_LINK(library, includes, function-body [, action-if-true [, action-if-false]])
#
# DESCRIPTION
#
# This function is a wrapper around AC_ARG_WITH, which adds -I"value" to CPPFLAGS.
# "--with-" variable is initialized to default value, if it is passed.
#
AC_DEFUN([AX_TRY_LINK], [
    dnl Below logic is a workaround for the limitation, that variables may not allow
    dnl symbols like "+" or "-". See AC_CHECK_LIB source comments for more information.
    m4_ifval([$4], , [AH_CHECK_LIB([$1])])
    AS_LITERAL_IF([$1],
        [AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1_$2])],
        [AS_VAR_PUSHDEF([ac_Lib], [ac_cv_lib_$1''_$2])])

    AC_CACHE_CHECK([for -l$1], [ac_Lib], [
        dnl Save the current state
        AC_LANG_SAVE
        AC_LANG_CPLUSPLUS
        ax_try_link_save_LIBS=$LIBS
        LIBS="-l$1 $LIBS"

        AC_TRY_LINK([$2], [$3], [AS_VAR_SET([ac_Lib], [yes])], [AS_VAR_SET([ac_Lib], [no])])

        dnl Restore the state to original regardless to the result
        LIBS=$ax_try_link_save_LIBS
        AC_LANG_RESTORE
    ])

    dnl If the variable is set, we define a constant and push library to LIBS by default or execute $4, otherwise execute $5.
    AS_VAR_IF([ac_Lib], [yes],
        [m4_default([$4], [
            AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_LIB$1))
            dnl Do not prepend a library, if it is already in the list:
            (echo $LIBS | grep -q -- "-l$1 ") || LIBS="-l$1 $LIBS"
        ])],
        [$5]
    )
    AS_VAR_POPDEF([ac_Lib])
]) # AX_ARG_WITH

في هذه اللحظة configure.ac:

AC_INIT([ABC], [1.2.3])
AC_LANG([C++])
AC_PROG_CXX
AC_CXX_HAVE_STL

if test "x${ac_cv_cxx_have_stl}" != "xyes"; then
    AC_MSG_ERROR([STL was not found; make sure you have installed libstdc++-dev])
fi

...

dnl openbabel library

sr_openbabel_lib=yes

AC_CHECK_HEADERS([openbabel/mol.h openbabel/obconversion.h openbabel/builder.h], [], [sr_openbabel_lib=no])
AX_TRY_LINK([openbabel], [
    #include <openbabel/mol.h>
    #include <openbabel/obconversion.h>
    #include <openbabel/builder.h>
], [
    OpenBabel::OBAtom atom;
    OpenBabel::OBMol mol;
    OpenBabel::OBConversion conversion;

    atom.IsHeteroatom();
    atom.IsCarbon();

    mol.NumAtoms();
    mol.NumBonds();
    mol.NumRotors();
    mol.GetAtom(0);

    conversion.ReadString(&mol, "");
    conversion.WriteString(&mol, false);
], [], [sr_openbabel_lib=no])

if test ${sr_openbabel_lib} != yes; then
    AC_MSG_ERROR([openbabel headers or library was not found (use --with-openbabel to define custom header location)])
fi

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

لا أعرف أي شيء من هذا القبيل لـ Linux أو Mac ، لكنني متأكد من وجود شيء ما.

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