WebHU - Programozási kérdések és válaszok

A lib{könyvtár neve}.a / .so elnevezési konvenció a statikus könyvtárak számára Linuxban?

A közelmúltban egy Ubuntu rendszeren kellett kisebb programozást végeznem (amiben nagyon alacsony szintű kezdő vagyok), és tényleg csak most ismerkedem a makefile-okkal.

Észrevettem, hogy az argumentumok, amelyek megmondják a linkernek, hogy mely könyvtárakat vegye fel, mindig a -l{könyvtár neve} volt, ahol a megfelelő könyvtár valami "lib{könyvtárnév}.a" lesz a /usr/lib mappában.

Kíváncsi vagyok: ez egy egyezmény? Azt hittem volna, hogy be kell írnom a -llibNAME parancsot, hogy megtaláljam a libNAME.a nevű könyvtárat, de úgy tűnik, hogy lib előtagot feltételez.

Ez mindig így van? Elnevezhetek egy könyvtárat lib előtag használata nélkül?


  • A válasz nem. A statikus könyvtárak elnevezési konvenciója lib{name}.a. 03.07.2011
  • ... miközben .so fájl megosztott könyvtár. 03.07.2011
  • Hoppá, hülye hiba! Kösz! 03.07.2011

Válaszok:


1

Bármilyen módon elnevezheti az egyiket, de a ld -l lib előtagot feltételezve mind a statikus, mind a megosztott könyvtárakra vonatkozik, és hosszú múltra tekint vissza; A lib előtag nélküli használatához kifejezetten meg kell neveznie.

Ez még a modern rendszereken is hasznos: a libfoo.so név link-time könyvtárként azonosítható, míg a foo.so egy futásidejű bővítményt megvalósító megosztott objektumot jelöl. Vagy alrendszer-specifikus előtagok a lib helyett az egyes alrendszerek beépülő moduljainak azonosítására; lásd például a pam_*.so és nss_*.so.

03.07.2011

2

A name.a egy statikus könyvtár (a mert ez egy objektumarchívum).

A name.so egy dinamikus könyvtár (so mert ez egy megosztott objektum, amelyet néha DSO-nak is neveznek, a dinamikus megosztott objektumokhoz).

A -lfoo linker kapcsoló hagyományosan libfoo.{so,a} alakú nevet vesz fel, és a könyvtár elérési útján keresi. A könyvtárnevet közvetlenül is átadhatja a linkernek (a -l kapcsoló használata nélkül), de ebben az esetben kifejezetten át kell adnia a könyvtár elérési útját.

Ahogy @geekosaur megjegyezte, ha futás közben nyit meg egy megosztott objektumot, a dlopen() a teljes fájlnevet veszi fel.

03.07.2011

3

Rövid válasz: igen, ez a konvenció.

A g++ -l kapcsolója ellenőrzi a lib{somename}.so fájlt a lib és a helyi elérési útban.

A UNIX-ban azonban használhatunk szimbolikus hivatkozásokat is, így a könyvtárak különböző verzióit használhatjuk anélkül, hogy módosítanánk a make scripteket.

szerkesztés hozzáadáshoz:

Ahogy valaki a megjegyzésben rámutatott, a .a a statikus könyvtár kiterjesztése, míg a .so egy megosztott könyvtár.

03.07.2011

4

Valójában nem. Mármint majdnem! Ön keveri a statikus könyvtárakat megosztott könyvtárakkal. A statikus könyvtárak .a fájlok, a megosztott könyvtárak pedig .so-vel végződnek.

Összefoglalva: megosztott könyvtárakról beszélsz, oké? Amikor az alkalmazást megosztott könyvtárakkal kapcsolja össze, a szabványos konvenciót kell használnia, amely a -lNAME, ahol a NAME a libNAME.so fájlhoz tartozik.

03.07.2011
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..