AMcoder - javascript, python, java, html, php, sql

Ինչու է սխալ գործառույթը կապակցվել կապողի կողմից:

Ես շատ շփոթված եմ հետևյալ իրավիճակում.

Ես ունեմ Linux նախագիծ (որը գրված է c-ով), որն օգտագործում է ստատիկ գրադարան A՝ գործարկվող սարք ստանալու համար: Այս ստատիկ գրադարանում A կա c ծածկագիր, որը կանչում է sem_init Linux-ից ներառում է. .c ֆայլում ներառված է semaphore.h ֆայլը, որը կազմվել է GCC-ի միջոցով՝ առանց նախազգուշացման: Ես օգտագործում եմ ld linker:

Ամեն ինչ լավ էր, քանի դեռ ես ակամա ավելացրի նոր մոդուլ (որը կազմվել է ստատիկ գրադարանում B) նախագծին: Նոր կոդը ունի նույն անունով ֆունկցիա (sem_init), բայց այլ ստորագրություն: A-ի կոդը չի ներառում B-ից .h ֆայլ, որը սահմանում է նոր sem_init():

Հիմա, կոմպիլյացիան B գրադարանի ավելացումից հետո տեսա, որ semaphore.h-ից sem_init-ի փոխարեն B գրադարանից կանչվեց նոր sem_init:

Ես գիտեմ, որ նույն անունով գործառույթներ կանչելը սարսափելի գաղափար է, բայց մեծ նախագծի շրջանակներում դա կարող է պատահաբար պատահել:

Հարց՝ ինչու՞ դա տեղի ունեցավ??? Ինչու է linker ընտրել նոր sem_init??? Ինչու ես չստացա բազմակի սահմանման կապի սխալ:

31.05.2020

  • Ի տարբերություն C++-ի, ես չեմ հավատում, որ կապողը գիտի C ֆունկցիայի ստորագրությունների մասին, ուստի մեկը sem_init()-ը նույնքան լավն է, որքան մյուսը, և եթե այն դուրս է գալիս գրադարանից, ես կպատկերացնեի, որ այն վերցնում է առաջինը: այն գտնում է. 31.05.2020
  • Խնդրում ենք տրամադրել նվազագույն վերարտադրվող օրինակ կամ գոնե ձեր կազմման և կապի հրամանները: Կապակցիչը սկանավորում է գրադարանները միայն չլուծված նշանների համար: Որ գրադարանն առաջինը սկանավորվի, հաղթում է: 31.05.2020
  • Արդյո՞ք ճիշտ է, որ C++-ում դա անհնար է անունների խեղաթյուրման պատճառով: Կներեք, մինիմալ օրինակ չեմ կարող բերել, ես իմ հարցի մեջ օրինակ եմ պարզեցրել, իրականում նախագիծը պարունակում է 10 գրադարան, և դա սեփականության ծածկագիր է։ 01.06.2020
  • Դա տեղի չի ունենում խոշոր նախագծերում, քանի որ խոշոր նախագծերն ունեն անվանման պայմանագրեր: 01.06.2020

Պատասխանները:


1

Երբ կապակցիչը կապում է ստատիկ գրադարանները, այնտեղ փնտրում է միայն չսահմանված սիմվոլներ, և եթե գտնում է սահմանում, ապա կապում է այն և լուծում է խորհրդանիշը: sem_init-ը գալիս է B-ից, որը կապված է -lc-ից առաջ (GNU C ստանդարտ գրադարանը, որն իրականացնում է նաև POSIX sem_init-ը), կապված է, և, հետևաբար, կապողն ընտրում է sem_initB-ից և այնուհետև երբեք չի փնտրում sem_init, ահա թե ինչու դուք չեք փնտրում: ստացեք բազմաթիվ նշանների սահմանման սխալ:

B գրադարանը, հավանաբար, մտադիր չէ իրականացնել POSIX sem_init-ը այլ պարամետրերի ցանկով: Այն հավանաբար պետք է նշի իր sem_init-ը որպես static, որպեսզի այն տեսանելի չլինի թարգմանչական այլ միավորների համար: Եվ/կամ օգտագործեք բոլորովին այլ անուն դրա համար:

31.05.2020
  • շատ շնորհակալություն. դա ինձ համար նորություն էր: Ես գրեթե համոզված էի, որ նույն անունն ունեցող, բայց տարբեր ստորագրություններ ունեցող ֆունկցիաները միմյանց հետ փոխանակելի չեն լինի C-ում։ 01.06.2020
  • @user3518295 Դուք իրավացի եք, C++ name mangling-ը կոդավորում է պարամետրերի տեսակները մաշված ֆունկցիայի անվան մեջ: 01.06.2020
  • Եվս մեկ անգամ շնորհակալություն: Եվ ինչու՞ այս իրավիճակում (C կոդով) բազմակի սահմանման կապի սխալ տեղի չունեցավ: Բազմակի սահմանման կապի սխալը դա այն սխալն է, որը պետք է կանխի այն իրավիճակը, երբ կապակցողը չգիտի, թե որ նշանի սահմանումը պետք է վերցնի չլուծված խորհրդանիշը լուծելու համար, չէ՞: 01.06.2020
  • @user3518295 Ես պատասխանեցի, որ 1-ին պարբերությունում գրադարանների դեմ հղում անելը այդպես է գործում։ Դուք ստանում եք բազմակի սահմանման կապող սխալ միայն այն դեպքում, երբ մի քանի .o ֆայլեր միացնում եք կրկնօրինակ խորհրդանիշի սահմանմամբ գործարկվող կամ համօգտագործվող գրադարանի մեջ: 01.06.2020
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..