2010-02-02 25 views
35

Estoy compilando un proyecto propio. Y es detenido por este error:¿Qué es el archivo * .o?

LINK||fatal error LNK1181: cannot open input file 'obj\win\release\src\lua\bindings.o'|

Compilación usando Code :: Blocks, con el VS 2005/2008 compilador bajo win7. También hay muchos otros directorios vacíos donde faltan archivos * .o.

¿Qué hacen?

+1

En primer lugar, un archivo '.o' es una etapa intermedia entre la compilación y el enlace. Si hay errores de compilación, VS 2008 no generará un archivo '.o', pero continuará intentando crear la aplicación, fallando después de la etapa de enlace. Cuando está aturdido, siempre puede intentar un "Reconstruir todo"; Sin embargo, recomiendo investigar los registros de errores para los archivos de objetos faltantes. –

Respuesta

54

Un archivo que termina en .o es un archivo de objeto . El compilador crea un archivo de objeto para cada archivo fuente, antes de vincularlos entre sí, en el ejecutable final.

+0

Hm, ¿qué razones pueden estar aquí? ¿Por qué el compilador no crea archivos de objeto para todas las fuentes de necesidad? – Ockonal

+0

Un compilador no puede hacer un archivo de objeto para la fuente que no tiene. –

+0

Puede haber muchas razones. Lo más probable es que haya estropeado algunas inclusiones o arruinado una plantilla. También podría ser algún tipo de engarce lo que está mal, pero dudo que :) – cwap

3

Un archivo de archivo objeto (también .obj en Windows) contiene código de objeto compilado (es decir, código máquina producido por su compilador C o C++), junto con los nombres de las funciones y otros objetos que contiene el archivo. Los archivos de objeto son procesados ​​por el vinculador para producir el ejecutable final. Si su proceso de compilación no ha producido estos archivos, es probable que haya algún problema con sus archivos makefile/project.

0

Ink-Jet tiene razón. Más específicamente, un archivo de objeto .o (.obj) - o es un único archivo fuente compilado en código máquina () No estoy seguro de si el "código máquina" es el mismo o similar a un código máquina ejecutable). En definitiva, es un intermedio entre un programa ejecutable y un archivo fuente de texto sin formato.

El vinculador usa los archivos o para ensamblar el archivo ejecutable.

Wikipedia puede tener más información detallada. No estoy seguro de cuánta información le gustaría o necesita.

26

Has obtenido algunas respuestas, y la mayoría son correctas, pero te pierdas lo que (creo) es probablemente el punto aquí.

Supongo que tiene un archivo MAKE que está tratando de usar para crear un archivo ejecutable. En caso de que no esté familiarizado con ellos, makefiles enumera las dependencias entre los archivos. Para un caso muy simple, que podría tener algo como:

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

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

La primera línea dice que "MyProgram.EXE" depende de "myprogram.o". La segunda línea dice cómo crear myprogram.exe desde myprogram.o. La tercera y la cuarta líneas dicen que myprogram.o depende de myprogram.cpp y de cómo crear myprogram.o desde myprogram.cpp (respectivamente).

Supongo que en su caso, tiene un archivo MAKE como el anterior que se creó para gcc. El problema al que se está enfrentando es que lo está usando con MS VC en lugar de gcc. Da la casualidad, MS VC usa ".obj" como la extensión para sus archivos de objeto en lugar de ".o".

Eso significa que cuando make (integrado en el IDE en su caso) intenta compilar el programa, mira esas líneas para intentar averiguar cómo compilar myprogram.exe. Para hacer eso, ve que necesita construir myprogram.o, por lo que busca la regla que le dice cómo construir myprogram.o. Eso dice que debería compilar el archivo .cpp, por lo que hace eso.

Luego, las cosas se descomponen: el compilador de VC++ produce myprogram.obj en lugar de myprogram.o como archivo de objeto, por lo que cuando intenta pasar al siguiente paso para producir myprogram.exe de myprogram.o, encuentra que su intento de crear myprogram.o simplemente falló. Hizo lo que decía la regla, pero eso no produjo mi programa.No sabe qué hacer, por lo que se cierra y le muestra un mensaje de error.

La cura para ese problema específico es probablemente bastante simple: edite el archivo make para que todos los archivos objeto tengan una extensión de ".obj" en lugar de ".o". Sin embargo, hay lugar para una gran cantidad de preguntas sobre si eso arreglará todo: eso puede ser todo lo que necesita, o simplemente puede llevar a más problemas (probablemente más difíciles).

+0

¿Entonces $ (CC) es para el compilador? – zygimantus

+1

@zygimantus: sí. En teoría, es el compilador de C, pero al menos en la mayoría de los casos los compiladores de C y C++ son el mismo binario (que ordena el idioma según la extensión del archivo que se está compilando). –

+0

Reemplacé todas mis extensiones '.o' con' .obj', pero ahora está ocurriendo el mismo error: 'make (e = 2): el sistema no puede encontrar el archivo especificado. make: *** [src/haproxy.obj] Error 2 ' – Taurus