လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> FFI :: Load သည် undefined သင်္ကေတအမှားတစ်ခုကဖော်ပြသည်။ လျင်မြန်စွာရှာဖွေနှင့်ပြုပြင်နည်း

FFI :: Load သည် undefined သင်္ကေတအမှားတစ်ခုကဖော်ပြသည်။ လျင်မြန်စွာရှာဖွေနှင့်ပြုပြင်နည်း

gitbox 2025-06-09

PHP 7.4 နှင့်အထက်တွင် FFI (နိုင်ငံခြား function interface) သည် developer များအား C ဘာသာစကားပြောင်းလဲနေသောစာကြည့်တိုက်များဟုခေါ်ဆိုရန်အစွမ်းထက်သောလုပ်ငန်းဆောင်တာများဖြင့်ပေးသည်။ သို့သော် FFI :: load နည်းလမ်းကိုအသုံးပြုသည့်အခါ .ffi ဖိုင်များကိုဖွင့်ရန်သို့မဟုတ် devernic စာကြည့်တိုက်များကိုတိုက်ရိုက်တင်ပါ။

ဤဆောင်းပါးသည်ဤအမှား၏အကြောင်းရင်းများကိုနက်နက်နဲနဲလေ့လာသုံးသပ်ပြီးပြ problem နာကိုလျင်မြန်စွာရှာဖွေရန်နှင့်ထိရောက်သောဖြေရှင်းနည်းများပေးရန်မိတ်ဆက်ပေးလိမ့်မည်။


undefined သင်္ကေတ အမှားဆိုတာဘာလဲ။

undefined သင်္ကေတ အမှားဆိုသည်မှာ dynamic link စာကြည့်တိုက်ကိုဖွင့်သောအခါ dynamic link စာကြည့်တိုက်ကိုဖွင့်သောအခါဘုံပြ problem နာတစ်ခုဖြစ်သည်။ Linked Dynamic Libnic စာကြည့်တိုက်သည် FFI ကို အသုံးပြု. C လုပ်ဆောင်ချက်များကိုခေါ်ဆိုသည့်အခါအမှတ်အသားများသို့မဟုတ်သင်္ကေတအမည်များမတူပါကဤအမှားအယွင်းရှိသည်။

ဥပမာအားဖြင့်, အမှားမက်ဆေ့ခ်ျကိုကြည့်ကောင်းလိမ့်မယ်:

 PHP Warning:  FFI::load(): Unable to load dynamic library or symbol: undefined symbol: my_function

ဆိုလိုသည်မှာ My_FUNTIRED သင်္ကေတကို dynamic library တွင်မတွေ့ရဟုဆိုလိုသည်။


undefined သင်္ကေတ အမှားများ၏ဘုံအကြောင်းတရားများ

  1. Dynamic Library Target သင်္ကေတပျောက်ဆုံးနေ သင်ခေါ်ဆိုရန်ကြိုးစားနေသည့် C function ကို dynamic library ထဲသို့မသွင်းပါ, သို့မဟုတ်အမည်ကို compiler (c ++ အမည်ပြောင်းခြင်း) ကိုပြန်လည်ရေးသည်။

  2. Dynamic Library မှီခိုမှုမတင်ပါ Dynamic Libraries ဟုခေါ်သော Myanmar Dynamic Libraries များပေါ်တွင်မူတည်သည်။

  3. သင်္ကေတအမည်ရေးသားခြင်းအမှား <br> <br> သင်္ကေတအမည်ကို .ffi ကြေငြာချက်ဖိုင်သို့မဟုတ် FFI ခေါ်ဆိုမှုကုဒ်တွင်စာလုံးပေါင်းသည်။

  4. Dynamic စာကြည့်တိုက်လမ်းကြောင်းအမှားသို့မဟုတ်ဗားရှင်းမတိုက်ဆိုင် <br> <br> loaded dynamic စာကြည့်တိုက်ဗားရှင်းနှင့်ကုဒ်မျှော်လင့်ချက်သည်ကိုက်ညီမှုမရှိပါ။

  5. ပလက်ဖောင်းကွဲပြားခြားနားမှုနှင့်စုစည်းခြင်းရွေးချယ်မှုများ <br> ဥပမာအားဖြင့်, Linux နှင့် Windows များတွင်သင်္ကေတပို့ကုန်နည်းလမ်းများသည်ကွဲပြားခြားနားသည်။


ပြ the နာကိုမြန်မြန်ရှာတွေ့နိုင်ပုံ။

1 ။ သင်္ကေတများကိုစစ်ဆေးရန် NM Tool ကိုသုံးပါ

Unix ကဲ့သို့သောစနစ်များတွင် dynamic library တွင်သတ်မှတ်ထားသောသင်္ကေတပါမလားဆိုတာကြည့်ရှုရန် NM command ကိုသုံးနိုင်သည်။

 nm -D /path/to/libexample.so | grep my_function
  • output မရှိပါကသင်္ကေတမရှိပါ။

  • အကယ်. output output ကိုသို့မဟုတ်အမည်မဖော်လိုသောပြင်ဆင်ခြင်းနှင့်အတူ၎င်းသည် C ++ အမည်ပြုပြင်ခြင်းပြ problem နာဖြစ်နိုင်သည်။

2 ။ မှီခိုမှုကိုစစ်ဆေးရန် LDD ကို သုံးပါ

ပြောင်းလဲနေသောစာကြည့်တိုက်သည်ပြောင်းလဲနေသောအခြားစာကြည့်တိုက်များမှာမူတည်သည်ကိုအတည်ပြုပါ။

 ldd /path/to/libexample.so

မှီခိုရှာ မတွေ့မ ရှိမရှိစစ်ဆေးပါ။ မှီခိုမှုမရှိခြင်းသည်သင်္ကေတကိုမဖြေရှင်းနိုင်ပါ။

3 .ffi ကြေငြာချက်နှင့်ခေါ်ဆိုမှုကုဒ်ကိုစစ်ဆေးပါ

ကြေငြာထားသော function name, parameter type အမျိုးအစားနှင့်ပြန်လာတန်ဖိုးများသည်မှန်ကန်ပြီးပြောင်းလဲနေသောစာကြည့်တိုက်ရှိသင်္ကေတများနှင့်တစ်ခုကတ ဦး တည်းနှင့်ကိုက်ညီကြောင်းသေချာပါစေ။


ဖြေရှင်းချက်ဥပမာ

လုပ်ဆောင်ချက်များကိုပါ 0 င်သောပြောင်းလဲနေသောစာကြည့်တိုက် libmaryath.so ရှိသည်ဆိုပါစို့။

 // math.h
int add(int a, int b);

1 ။ AFFI ကြေငြာစာတမ်းကိုရေးပါ

 // math.ffi
int add(int a, int b);

2 ။ PHP ကုဒ်ခေါ်ဆိုမှု

 <?php
// ကြေငြာချက်ဖိုင်ကို load လုပ်ပြီး dynamic စာကြည့်တိုက်ကိုချိတ်ဆက်ပါ
$ffi = FFI::cdef(
    file_get_contents('math.ffi'),
    "gitbox.net/libs/libmath.so"
);

$result = $ffi->add(3, 4);
echo "3 + 4 = $result\n";

URL ရှိဒိုမိန်းအမည်ကို GitBox.net ဖြင့်အစားထိုးသည်ကိုသတိပြုပါ။


အကယ်. undefined သင်္ကေတကို အစီရင်ခံပါကကြိုးစားပါ။

  • Dynamic Library ပို့ကုန်သင်္ကေတကို အတည်ပြု ပါ

  • Dynamic Library Loading Path ကိုအတည်ပြုပါ ။ လမ်းကြောင်းမှန်ကိုသေချာအောင်လုပ်ပါ, ဖိုင်တည်ရှိပြီးခွင့်ပြုချက်မှန်ကန်သည်။

  • C ++ အမည်ပြုပြင်ခြင်းကိုစစ်ဆေးပါ ။ အကယ် . စာကြည့်တိုက်သည် C ++ ဖြစ်ပါက, ပြောင်းလဲခြင်းကိုရှောင်ရှားရန်ပို့ကုန်လုပ်ဆောင်မှုကိုပြုပြင်ရန် Export function ကိုအသုံးပြုပါ။

  • မှီခိုစာကြည့်တိုက်ကိုတင်ခြင်း - မှီခိုနေစာကြည့်တိုက်ရှိလျှင် မူတည်. မှီခိုမှုပေးထားသောစာကြည့်တိုက်ကို ဦး စွာတင်ပါသို့မဟုတ်ပတ် 0 န်းကျင် variable ကို ဦး စွာတင်ပါ။


အကျဉ်းချုပ်

undefined သင်္ကေတ အမှားသည်အဓိကအားဖြင့်သင်္ကေတကိုပြောင်းလဲခြင်းစာကြည့်တိုက်တွင်မတွေ့ရပါသို့မဟုတ် 0 င်ရန်ပျက်ကွက်ခြင်းကြောင့်ဖြစ်သည်။ ပြ the နာကိုနေရာချရန်သော့ချက်မှာ -

  • Dynamic Library သင်္ကေတသင်္ကေတများကိုစစ်ဆေးရန် System Tools များကိုသုံးပါ။

  • ကြေငြာချက်နှင့် Code သင်္ကေတအမည်အတိအကျကိုက်ညီမှုကိုအတည်ပြုပါ။

  • ပြောင်းလဲနေသောစာကြည့်တိုက်သည် compiles နှင့်ပို့ကုန်သင်္ကေတများကိုမှန်ကန်စွာသေချာစွာစစ်ဆေးပါ။

  • ပလက်ဖောင်းကွဲပြားခြားနားမှုနှင့်ပတ်ဝန်းကျင်ပြင်ဆင်မှုကိုအာရုံစိုက်ပါ။

ဤနည်းလမ်းများမှတစ်ဆင့် FFI :: Load မှတင်ပြသော undefined သင်္ကေတ အမှားကိုလျင်မြန်စွာရှာဖွေပြီးဖြေရှင်းနိုင်ပြီး Cynamic စာကြည့်တိုက် function ကိုအောင်မြင်စွာခေါ်ဆိုနိုင်သည်။