كيف يمكنني التحقق من رمز C ++ غير مشغول عند بناء ملحق PHP؟

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

سؤال

لدي وحدة PHP مكتوبة في C ++، والتي تعتمد على مكتبة C ++ (Boost Date_Time) التي يتم تثبيتها.

حاليا، في ملف CONFIG.M4 الخاص بي، أتحقق من المكتبة كما يلي:

  LIBNAME=boost_date_time
  LIBSYMBOL=_ZN5boost9gregorian9bad_monthD0Ev

  PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,,
  [
    AC_MSG_ERROR([lib $LIBNAME not found.  Try: sudo apt-get install libboost-dev])
  ],[
    -lstdc++ -ldl
  ])

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

كيف يمكنني الحصول على السيارات لفهم رمز C ++ غير المشبي؟

يحرر:

أدرك أن التحقق من اسم المشارك أمر فظيع، لكنه لا يوجد طريقة للتحقق من اسم الرمز كما عاد بواسطة "NM -C" (مثل دفعة :: Gregorian :: bad_month إلخ).

لقد وجدت بعض التفكير إلى أمر السيارات AC_LANG_CPLUSPLUS ()، لكنني لست متأكدا من كيفية استخدامه وما إذا كان قابلا للتطبيق هنا.

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

المحلول

يمكنك التحقق AC_TRY_COMPILE مع شيء من هذا القبيل:

LIBNAME=boost_date_time
AC_MSG_CHECKING([for BOOST])
AC_TRY_COMPILE(
[
#include "boost/date_time/gregorian/greg_month.hpp"
],
[
boost::gregorian::bad_month* bm = new boost::gregorian::bad_month;
],
[
AC_MSG_RESULT(yes)
],
[
AC_MSG_ERROR([lib $LIBNAME not found.  Try: sudo apt-get install libboost-dev])
])

هذا تجنب استخدام الرمز غير المشقوق.

نصائح أخرى

خارج بيئة مترجم معين C ++، لا يوجد "رمز غير مشترك C ++" - يتم إجراء المشاهير على وجه التحديد لتوفير اسما فريدا للأدوات الخارجية، مثل الروابط وأمناء المكتبات.

هذه هي فكرة فظيعة - أن تخرج الرموز في العراء. لماذا تحتاج إلى هذا في المقام الأول؟

بعد أن رأيت التحديث الخاص بك، يجب أن أسأل، لماذا لا تستخدم قاعدة مخصصة لاستدعاءها nm واحصل على هذه المعلومات وجعل هذه القاعدة ليتم تمريرها كشرط؟ سأكون مندهشا جدا إذا autoconf كان لتوفير أمر مباشر للتحقق من ملفات الكائنات للرموز.

تحتاج إلى توفير مجموعة من أغلفة C ++ لوظائف Boost API التي ترغب في استدعاءها. يجب أن يتم الإعلان عن هذه الأغلفة extern "C", ، كما في:

extern "C" 
void foo(int bar) 
{
...
}

يجب أن يستخدم رمز PHP الخاص بك هذه الأغلفة، بدلا من محاولة الاتصال مباشرة بطرق C ++.

تعديل: منذ أن تفترض توافر automake, ، ربما تخطط لتجميع مكتبة Boost كجزء من التثبيت. يمنحك هذا خيار التحقيق في نتيجة اسم المشاهير. حاول إنشاء برنامج اختبار C ++ على طول هذه الخطوط. لاحظ أن هذا يحتاج فقط إلى الترجمة; ؛ لا يحتاج إلى إنتاج نتيجة صالحة.

#include "boost/date_time/gregorian/greg_month.hpp"
int main( int argc, const char* argv[] )
{
   boost::gregorian::bad_month* xxxjunk = new boost::gregorian::bad_month;
   return 0;
}

في أغتاريك، تريد تجميع هذا، ثم قم بتشغيل الإخراج من خلال

nm -C | grep "boost::gregorian::bad_month"

اعتمادا على احتياجاتك والشفاء، قد ترغب في زيادة تحسين grep أمر للبحث عن السلسلة "typeinfo for boost::gregorian::bad_month"(لاحظ أن هذا يزيد من اعتمادك على تنفيذ التحويل البرمجي المحدد.)

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