Wat is * .o-bestand?

Ik stop het eigen project. En het stopte met deze fout:

Link || Fatale fout LNK1181: kan niet openen
Invoer bestand
‘obj \ win \ release \ src \ lua \ bindings.o’ |

Compileren met code :: Blocks met VS 2005/2008 Compiler onder WIN7.
Er zijn ook veel andere lege mappen waar * .o-bestanden ontbreken.

Wat doen ze?


Antwoord 1, Autoriteit 100%

Een bestand dat eindigt in .o is een -objectbestand . De compiler maakt een objectbestand voor elk bronbestand, voordat u ze samen koppelt, in het laatste uitvoerbare bestand.


Antwoord 2, Autoriteit 47%

Je hebt wat antwoorden gekregen, en de meesten van hen zijn correct, maar missen wat (ik denk) waarschijnlijk het punt hier is.

Mijn gok is dat je een makefile hebt, je probeert te gebruiken om een ​​uitvoerbaar bestand te maken. Als u niet bekend bent met hen, vermeldt de afhankelijkheden van de makeFiles tussen bestanden. Voor een heel simpele behuizing kan het zoiets hebben als:

myprogram.exe: myprogram.o
    $(CC) -o myprogram.exe myprogram.o
myprogram.o: myprogram.cpp
    $(CC) -c myprogram.cpp

De eerste regel zegt dat myprogram.exeafhankelijk is van myprogram.o. De tweede regel vertelt hoe u myprogram.exevan myprogram.omaken. De derde en vierde regels zeggen myprogram.ohangt af van myprogram.cppen hoe u myprogram.ovan respectievelijk myprogram.cpp` maakt.

Mijn gok is dat je in jouw geval een makefile hebt zoals die hierboven is gemaakt voor GCC. Het probleem waar je naartoe loopt, is dat je het gebruikt met MS VC in plaats van GCC. Zoals het gebeurt, gebruikt MS VC “.obj” als extensie voor zijn objectbestanden in plaats van “.o”.

Dat betekent dat wanneer make (of het equivalent dat in jouw geval in de IDE is ingebouwd) het programma probeert te bouwen, het naar die regels kijkt om te proberen uit te vinden hoe myprogram.exemoet worden gebouwd. Om dat te doen, ziet het dat het myprogram.omoet bouwen, dus zoekt het naar de regel die vertelt hoe het myprogram.omoet bouwen. Dat zegt dat het het .cpp-bestand moet compileren, dus dat doet het.

Dan gaan de zaken kapot — de VC++-compiler produceert myprogram.objin plaats van myprogram.oals het objectbestand, dus wanneer het probeert naar de volgende stap te gaan om myprogram.exete produceren van myprogram.o, constateert het dat zijn poging om myprogram.ote maken gewoon is mislukt. Het deed wat de regel zei, maar dat leverde niet myprogram.oop zoals beloofd. Hij weet niet wat hij moet doen, dus hij stopt en geeft een foutmelding.

De remedie voor dat specifiekeprobleem is waarschijnlijk vrij eenvoudig: bewerk het make-bestand zodat alle objectbestanden de extensie .objhebben in plaats van .o. Er is echter veel ruimte voor de vraag of dat alles zal oplossen — dat kan alles zijn wat je nodig hebt, of het kan gewoon leiden tot andere (waarschijnlijk moeilijkere) problemen.


Antwoord 3, autoriteit 7%

Een .o-objectbestand (ook .obj op Windows) bevat gecompileerde objectcode (dat wil zeggen machinecode die is geproduceerd door uw C- of C++-compiler), samen met de namen van de functies en andere objecten die het bestand bevat. Objectbestanden worden verwerkt door de linkerom het uiteindelijke uitvoerbare bestand te produceren. Als uw bouwproces deze bestanden niet heeft geproduceerd, is er waarschijnlijk iets mis met uw makefile/projectbestanden.


Antwoord 4, autoriteit 3%

Het is belangrijk op te merken dat objectbestandenworden samengevoegd tot binaire code in een indeling die verplaatsbaaris. Dit is een formulier waarmee de verzamelde code overal in het geheugen kan worden geladen voor gebruik met andere programma’s door een linker.

Instructies die verwijzen naar labels hebben nog geen adres toegewezen aan deze labels in het .o-bestand.

Deze labels worden als ‘0’ geschreven en de assembler maakt een verhuisrecord aan voor deze onbekende adressen. Wanneer het bestand is gekoppeld en uitgevoerd naar een uitvoerbaar bestand, worden de onbekende adressen opgelost en kan het programma worden uitgevoerd.

U kunt de tool nmop een objectbestand gebruiken om de symbolen weer te geven die in een .o-bestand zijn gedefinieerd.


Antwoord 5

Ink-Jet heeft gelijk. Meer specifiek, een .o (.obj) — of objectbestandis een enkelvoudig bronbestand dat is gecompileerd naar machinecode (Ik weet niet zeker of de “machinecode” hetzelfde is of vergelijkbaar met een uitvoerbare machinecode). Uiteindelijk is het een tussenproduct tussen een uitvoerbaar programma en een bronbestand in platte tekst.

De linker gebruikt de o-bestanden om het uitvoerbare bestand samen te stellen.

Wikipediaheeft mogelijk meer gedetailleerde informatie. Ik weet niet zeker hoeveel informatie je wilt of nodig hebt.

Other episodes