Ես շատ շփոթված եմ հետևյալ իրավիճակում.
Ես ունեմ 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??? Ինչու ես չստացա բազմակի սահմանման կապի սխալ:
.o
ֆայլեր միացնում եք կրկնօրինակ խորհրդանիշի սահմանմամբ գործարկվող կամ համօգտագործվող գրադարանի մեջ: 01.06.2020