Avatar billede yates Nybegynder
26. juli 2007 - 09:14 Der er 6 kommentarer

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.
Avatar billede tiller3 Nybegynder
26. juli 2007 - 12:39 #1
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.
Avatar billede yates Nybegynder
26. juli 2007 - 14:28 #2
Hej Tiller,

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.

Y.
Avatar billede yates Nybegynder
26. juli 2007 - 14:35 #3
.... 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??

Y.
Avatar billede arne_v Ekspert
26. juli 2007 - 15:25 #4
Jeg er lidt forvirret.

Mig bekendt linker du aldrig direkte mod en .dll.

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.
Avatar billede yates Nybegynder
27. juli 2007 - 09:57 #5
Hej Arne,

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*);

...og i _mingw.h følgende:

#ifndef __GNUC__
# ifndef __MINGW_IMPORT
#  define __MINGW_IMPORT  __declspec(dllimport)
# endif
# ifndef _CRTIMP
#  define _CRTIMP  __declspec(dllimport)
# endif
# define __DECLSPEC_SUPPORTED
# define __attribute__(x) /* nothing */
#else /* __GNUC__ */
# ifdef __declspec
#  ifndef __MINGW_IMPORT
  /* Note the extern. This is needed to work around GCC's
      limitations in handling dllimport attribute.  */
#  define __MINGW_IMPORT  extern __attribute__ ((dllimport))
#  endif
#  ifndef _CRTIMP
#  ifdef __USE_CRTIMP
#    define _CRTIMP  __attribute__ ((dllimport))
#  else 
#    define _CRTIMP
#  endif
#  endif
(med mere).

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.

Y.
Avatar billede arne_v Ekspert
08. august 2007 - 01:27 #6
Som jeg forstår det, så:
  - linker du altid med libcrtdll.a
  - koden i libcrtdll.dll bruger crtdll.dll
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester