87 votes

Qu'est-ce que le fichier *.o ?

Je compile mon propre projet. Et il s'est arrêté par cette erreur :

LINK||fatal error LNK1181 : cannot open fichier d'entrée obj \win\release\src\lua\bindings.o '|

Compilation à l'aide de Code::Blocks avec le compilateur VS 2005/2008 sous win7. Il y a aussi beaucoup d'autres répertoires vides où les fichiers *.o sont manquants.

Que font-ils ?

3 votes

Tout d'abord, un fichier '.o' est une étape intermédiaire entre la compilation et la liaison. S'il y a des erreurs de compilation, VS 2008 ne générera pas de fichier '.o', mais continuera à essayer de construire l'application, échouant après l'étape de liaison. En cas d'agitation, vous pouvez toujours essayer de "Reconstruire tout" ; cependant, je recommande de rechercher dans les journaux d'erreurs les fichiers objets manquants.

116voto

Joseph Salisbury Points 855

Un fichier se terminant par .o est un fichier objet . Le compilateur crée un fichier objet pour chaque fichier source, avant de les lier ensemble, pour obtenir l'exécutable final.

1 votes

Hm, quelles raisons peuvent être ici ? Pourquoi le compilateur ne crée pas de fichiers objets pour toutes les sources nécessaires ?

2 votes

Un compilateur ne peut pas créer un fichier objet pour une source qu'il n'a pas.

0 votes

Il peut y avoir beaucoup de raisons. Le plus probable est que vous vous soyez trompé dans les inclusions ou dans un modèle. Cela peut aussi être un mauvais paramétrage du linker, mais j'en doute :)

55voto

Jerry Coffin Points 237758

Vous avez obtenu quelques réponses, et la plupart d'entre elles sont correctes, mais elles passent à côté de ce qui (je pense) est probablement le point essentiel ici.

Je pense que vous avez un makefile que vous essayez d'utiliser pour créer un exécutable. Au cas où vous ne seriez pas familier avec eux, les makefiles listent les dépendances entre les fichiers. Pour un cas vraiment simple, il pourrait avoir quelque chose comme :

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

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

La première ligne dit que myprogram.exe dépend de myprogram.o . La deuxième ligne indique comment créer myprogram.exe de myprogram.o . Les troisième et quatrième lignes disent myprogram.o dépend de myprogram.cpp et comment créer myprogram.o de monprogramme.cpp` respectivement.

Je pense que dans votre cas, vous avez un makefile comme celui ci-dessus qui a été créé pour gcc. Le problème que vous rencontrez est que vous l'utilisez avec MS VC au lieu de gcc. Il se trouve que MS VC utilise ".obj" comme extension pour ses fichiers objets au lieu de ".o".

Cela signifie que lorsque make (ou son équivalent intégré dans l'IDE dans votre cas) essaie de construire le programme, il regarde ces lignes pour essayer de comprendre comment construire myprogram.exe . Pour ce faire, il voit qu'il doit construire myprogram.o donc il cherche la règle qui lui indique comment construire myprogram.o . Cela dit qu'il doit compiler le fichier .cpp, donc il le fait.

Ensuite, les choses s'effondrent : le compilateur VC++ produit myprogram.obj au lieu de myprogram.o en tant que fichier objet, donc quand il essaie de passer à l'étape suivante pour produire myprogram.exe de myprogram.o elle constate que sa tentative de créer myprogram.o a tout simplement échoué. Il a fait ce que la règle disait de faire, mais ça n'a pas produit myprogram.o comme promis. Il ne sait pas quoi faire, alors il s'arrête et vous donne un message d'erreur.

Le remède à cela spécifique Le problème est probablement assez simple : modifiez le fichier make pour que tous les fichiers objets aient une extension de .obj au lieu de .o . On peut toutefois se demander si cela va tout régler - cela peut être tout ce dont vous avez besoin, ou cela peut simplement conduire à d'autres problèmes (probablement plus difficiles).

2 votes

Donc $(CC) est pour le compilateur ?

2 votes

@zygimantus : oui. En théorie, c'est le compilateur C, mais au moins dans la plupart des cas, les compilateurs C et C++ sont le même binaire (qui trie le langage en fonction de l'extension du fichier en cours de compilation).

2 votes

J'ai remplacé tous mes .o extensions avec .obj mais maintenant la même erreur se produit : make (e=2): The system cannot find the file specified. make: *** [src/haproxy.obj] Error 2

8voto

Un fichier objet .o (également .obj sous Windows) contient le code objet compilé (c'est-à-dire le code machine produit par votre compilateur C ou C++), ainsi que les noms des fonctions et autres objets que le fichier contient. Les fichiers objets sont traités par le programme linker pour produire l'exécutable final. Si votre processus de construction n'a pas produit ces fichiers, il y a probablement quelque chose qui ne va pas avec vos fichiers makefile/projet.

4voto

Cyrus Vahidi Points 31

Il est important de noter que fichiers d'objets sont assemblés en code binaire dans un format qui est relocalisable . Il s'agit d'une forme qui permet de charger le code assemblé n'importe où dans la mémoire pour l'utiliser avec d'autres programmes par une linker .

Les instructions qui se réfèrent à des étiquettes n'auront pas encore d'adresse assignée pour ces étiquettes dans le fichier .o fichier.

Ces étiquettes seront écrites comme '0' et l'assembleur crée un enregistrement de relocalisation pour ces adresses inconnues. Lorsque le fichier est lié et transformé en exécutable, les adresses inconnues sont résolues et le programme peut être exécuté.

Vous pouvez utiliser le nm sur un fichier objet pour lister les symboles définis dans un fichier .o.

0voto

Frank V Points 9690

Ink-Jet a raison. Plus précisément, un fichier .o (.obj) -- ou fichier objet est un fichier source unique compilé en code machine ( Je ne suis pas sûr que le "code machine" soit identique ou similaire à un code machine exécutable. ). En définitive, il s'agit d'un intermédiaire entre un programme exécutable et un fichier source en texte brut.

L'éditeur de liens utilise les fichiers o pour assembler le fichier exécutable.

Wikipedia peut avoir des informations plus détaillées. Je ne suis pas sûr de la quantité d'informations que vous souhaitez ou dont vous avez besoin.

0 votes

Pour une référence future : La réponse de "Ink-Jet" est la suivante : l'utilisateur a depuis changé de nom - stackoverflow.com/a/2186252/13580938

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X