Manglende forståelse af linkage: Dynamisk vs. statisk
Hej,
jeg har et forståelsesmæssigt spørgsmål til hvad der foregår bag gardinerne når jeg kompilerer og eksekverer. Jeg bruger normalt MinGW/DevC++ (windows). Jeg er bekendt med statisk og dynamisk linkage, men dette spørgsmål går på sondringen nårt funktioner findes i både et statisk og et dynamisk lib.
Jeg har indtryk af at visse af c's funktioner (fx stricmp) findes i det dynamiske bibliotek crtdll.dll samt i det statiske bibliotek (libcrtdll.a). Ifm compilationen kan jeg vælge at linkeren skal anvende (eller have adgang til libcrtdll.a) osv. Betyder dette dersom jeg vælger at linke til et statisk lib så vil programmet altid benytte funktionen fra det statiske lib hvis den findes der, og ellers vil den bruge funktionen fra crtdll.dll ?? Eller er det specificeret i headerfilen på en eller anden måde hvorledes funktionen skal importeres når der er to muligheder?
Måske giver mit spørgsmål ikke mening, i så fald er det min basale forståelse af linkage som mangler. Lidt forklaring ønskes. 1000 tak på forhånd. Y.
Hvis du linker statisk, betyder det at funktionerne linkes(copieres) ind i din exe fil, og dermed bliver en del af dit program. (Stortset paa linie med de funktioner du selv har skrevet). En statisk linket exe fil, vil saaledes aldrig referer til statiske library naar den koere.
Med dynamisk linking, vil exe filen, naar den koere kalde funktionerne(kode) der ligger i det dynamiske library. Dette medfoere saa at hvis man opdatere/aendre det dynamiske linkede library(I dette tilfaelde din dll fil), vil exe filen kalde de nye funktioner, og at det dynamiske library, skal findes for at programmet virker.
jeg er sikker på du har ret, men det er noget lidt andet jeg spørger om. Jeg må hellere prøve at forklare lidt bedre og jeg beklager jeg ikke fik det formuleret rigtigt først. Måske skal jeg splitte detop i delspørgsmål:
1. En funktion (for exemplets skyld: strcmpi) findes både i crtdll. dll og i den statiske libcrtdll.a . Hvis jeg vælger at inkludere libcrt.dll til linkeren betyder det så at den bruger strcmpi fra det statiske bibliotek i stedet for det i crtdll.dll?
2. En funktion (for exemplets skyld: strcmpi) findes både i crtdll. dll og i den statiske libcrtdll.a . Hvis jeg vælger at inkludere libcrt.dll til linkeren, kan jeg så tvinge compåileren til at sørge for at exe-filen bruger crtdll.dll for netop denne funktion selvom den findes i mit lib som der linkes til?
Tusind tak og endnu en gang beklager jeg for manglende evne til at forklare mig.
.... og i tilgift lige følgende, der tyjener til opklaring:
3. Når compileren støder på en headerfil der specificerer en funktion X, vil den så først lede efter X blandt de biblioteker som linkes til, og hvis den ikke findes der, så udstede instruks om at importere den fra crtdll.dll ved runtime??
Du kan linke mod en fuld .a og faa hele funktionaliteten inkluderet i din .exe eller du kan linke mod en .a som indeholder en stub der bruger .dll via LoadLibrary og GetProcAddress.
Og du bestemmer hvilken ved at angive hvilket library du linker mod.
tak for din kommentar. Jeg prøver lige at omformulere mig igen. I string.h finder vi følgende functionsproto: _CRTIMP int __cdecl strcmpi (const char*, const char*);
Hvad er det disse linjer specificerer omkring _CRTIMP??
Lad os sige jeg gerne vil bruge strcmpi fra crtdll.dll men *samtidig* vil jeg også gerne bruge strcat fra libcrtdll.a. Strcat findes også i drtdll.dll og strcmpi findes også i libcrtdll.a og det er her jeg gerne vil forstå hvorledes compilation og linkage fungerer.
Hvis jeg linker til libcrtdll.a betyder det så at så vil det altid blive strcmpi fra libcrtdll.a der anvendes og ikke fra crtddl.dll som jeg ønskede? Jeg ved det lyder hypotetisk og uklart hvorfor jeg skulle ville ønske at gøre sådan, men jeg vil gerne forstå hvad der sker.
Som jeg forstår det, så: - linker du altid med libcrtdll.a - koden i libcrtdll.dll bruger crtdll.dll
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.