windows - Hvorfor får jeg en manglende dll-fejl efter at have linket til en .lib?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på dette Windows-program fra 1999. Jeg kunne ikke opbygge det i Visual Studio, da det fortsatte med at give mig linkerfejl om manglende symboler. Så min kollega fortalte mig at prøve at tage .lib-filer fra det oprindelige projekt og forsøge at angive dem som ekstra linkafhængigheder. Jeg gjorde det og programmet var fint. Da jeg forsøgte at køre det, klagede den over manglende dll-filer. Så jeg fandt en eksisterende kopi af Windows-programmet, der kører på en gammel computer, kopierede DLL-filer, og mit arbejde begyndte at fungere! Det var den lykkeligste dag i mit liv, men jeg ved ikke helt hvad der skete.


Kan nogen kort forklare, hvad er lib-filer i Windows, og hvordan de vedrører dll'er?

Bedste reference


Der er to anvendelser af .LIB-filer på Windows. Ken nævner en af ​​dem, som er til statisk sammenkobling, men der er en anden brug, som kaldes en import library, hvilket er hvad du har her. Hvis du opbygger en .DLL dig selv, har du mulighed for at oprette et importbibliotek til det. Effekten af ​​dette er, at du bare kan linke mod. LIB-filen, som du ville for et almindeligt statisk bibliotek, men .LIB indeholder faktisk kun kedepladekode for at indlæse indgangspunkterne fra DLL'en.


Årsagen til at dette er nyttigt er, at du måske skal distribuere kode som en dll (f.eks. Så du kan opdatere den uafhængigt af hovedapplikationen eller levere en dll som et plugin), men det gør det lettere at linke til applikationen fordi .LIB beskæftiger sig med LoadLibrary() og GetProcAddress() opkald, så du ikke behøver det. Det kan også indlæse klassedefinitioner fra en dll, som du ikke selv kan gøre med GetProcAddress().


Mere information om MSDN [10]

Andre referencer 1


.LIB (bibliotek) filer er samlinger af kompilerede kildefiler (objektfiler), som du kan linke ind i din applikation for at give funktionalitet. Linking gør objektfilerne brugt som en del af din eksekverbare selv. Dette er typisk kendt som static linking, og det er derfor, du fik kompileringstidsfejl om manglende symboler; bibliotekets filer var ikke tilgængelige for at udtrække den nødvendige objektkode fra for at tilføje den til din applikation.


.DLL (Dynamic Link Library) filer er kompileret kildefiler, som du kan indlæse ved runtime og bruge specifikke funktioner (normalt ved navn) fra; de er ikke del af din eksekverbare, men er indlæst i løbetid fra selve DLL'en. (Har ikke DLL'erne tilgængelige, som du allerede har oplevet betyder, at din app ikke kører.) De er ikke nødvendige på kompileringstidspunktet , men kun i løbetid.


Nogle IDE'er (f.eks. Visual Studio C/C ++) gør både en statisk .LIB -fil og en .DLL -version tilgængelig, så du kan vælge at få køretidsbiblioteker knyttet direkte til din ansøgning eller få dem tilgængelige at indlæse dynamisk i løbetid. (Det andet er nyttigt, hvis du f.eks. Har flere programmer, du har udviklet, du kan bruge den dynamiske version af MSVCRTL til drastisk at reducere størrelsen af ​​dine eksekverbare filer ved at distribuere RTL'en separat i stedet for at blive knyttet til hver applikation.