Error del vinculador de Xcode: archivo demasiado pequeño para la arquitectura x86_64

88

Estoy desarrollando una aplicación en Xcode.

Cuando intento construir, aparece este error:

ld: in /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o, file too small for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

¿Alguien sabe lo que pasa?

tbodt
fuente
59
Intente una reconstrucción / limpieza completa. Es posible que una compilación anterior haya sido anulada de manera anormal, dejando el TWRAppDelegate.oarchivo dañado o de tamaño cero.
Martin Baulig
5
Un poco de precisión: lo hace con cmd + shift + k, si eso no funciona, vaya a la carpeta de datos derivados y elimine la carpeta nombrada como su proyecto.
Ramy Al Zuhouri
3
@RamyAlZuhouri: Ya no hay necesidad de ir a la Papelera las carpetas de compilación. Mantenga presionada la tecla Opción y el comando Limpiar (que está en el menú Producto) cambia a "Limpiar carpeta de compilación ...", que lo hace por usted.
Peter Hosey
La sugerencia de Martin Baulig resolvió mi problema. ¡Gracias!
tbodt
2
@PeterK. Me está ganando la plata Niza Pregunta insignia :-)
tbodt

Respuestas:

186

Robando la respuesta de @ martin-baulig:

Intente una reconstrucción / limpieza completa. Es posible que la compilación anterior haya sido anulada de manera anormal, dejando el archivo TWRAppDelegate.o dañado o de tamaño cero.

Peter K.
fuente
7
¡Finalmente! Te lo mereces.
tbodt
¡Gracias! :-) Bueno, la respuesta de @ martin-bailig en los comentarios me ayudó, pero sería mejor tenerla aquí como una respuesta real.
Peter K.
2
Mi proyecto tarda un poco en construirse. Puede salirse con la suya eliminando solo los archivos de objeto 1-4 que se corrompen si detiene la compilación de forma anormal en lugar de todo.
Fernando Mazzon
20

Por lo general, agrego un espacio (podría ser cualquier carácter para el caso) al archivo en cuestión, lo elimino y luego lo guardo. Más fácil y rápido que una construcción limpia.

burrito de hierba
fuente
2
¡Tu respuesta me ahorra 10 minutos de reconstruir el proyecto! Gracias
Accid Bright
8

Para solucionar automáticamente este problema, Build Script Phasese puede agregar. Vaya a Xcode -> Su proyecto -> Su objetivo -> Fases de construcción -> + -> Nueva fase de ejecución del script

Cambie el nombre Xcode Link Fixy muévalo por encima de la Compile Sourcesfase. Pegue esto en el cuerpo del script:

# Legacy build system
legacy_dir=`dirname "${LD_DEPENDENCY_INFO_FILE}"`
if [ -d "${legacy_dir}" ]; then
    find "${legacy_dir}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

# New build system
if [ -d "${OBJECT_FILE_DIR_normal}" ]; then
    find "${OBJECT_FILE_DIR_normal}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

Esta secuencia de comandos busca archivos de objetos con tamaño cero y los elimina para que cuando la compilación se realice en el siguiente paso sea exitosa.

Debe agregar este script para cada destino de la aplicación si tiene muchos.

Este script tarda ~ 0,1 segundos en ejecutarse y le ahorra la reconstrucción completa del proyecto.

Anton Plebanovich
fuente
¡Es genial! Necesita tener en cada proyecto.
Nik Kov
7

rm -rf /Users/hostname/Library/Developer/Xcode/DerivedData

yeyimilk
fuente
5

simplemente elimine este archivo ejecutando cmd en su aplicación de terminal:

rm /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o

haithngn
fuente
1
Lo resolví de la misma manera, mucho más rápido que una limpieza / construcción completa en mi gran proyecto. La próxima vez que pruebe la solución de @Anton Plebanovich, podría ser una excelente manera de automatizar esta solución.
Romano
2

Manera rápida de corregir el error sin una limpieza completa de la caché:

  1. Abrir archivo descrito por error (en caso de esta pregunta TWRAppDelegate)
  2. cmd + A
  3. cmd + X
  4. Reconstruir - fallar
  5. cmd + V
  6. Reconstruir - tener éxito
Vadim Akhmerov
fuente
1

Dado que la construcción de un proyecto limpio puede llevar demasiado tiempo, hay una forma más corta para aquellos que tienen acceso al archivo que está dañado en la caché:

  • Eliminar el archivo (Eliminar referencia)
  • Proyecto de construcción
  • Reinsertar archivo
  • Proyecto de construcción

Versión completa para que no tenga problemas para encontrar el archivo:

  • Encuentre el archivo en el navegador de proyectos Xcode
  • Haga clic derecho en el archivo y presione "mostrar en el buscador" (abre un buscador en la ubicación donde está el archivo)
  • Seleccione el archivo en Xcode y presione la tecla de retroceso, luego haga clic en "Eliminar referencia"
  • Construir proyecto (fallará, pero espere a que termine)
  • Vuelva a insertar el archivo arrastrándolo desde el buscador a la misma ubicación donde lo acaba de eliminar
  • Construir proyecto (debería funcionar ahora)
Matic Oblak
fuente
1

Simplemente puede eliminar el archivo TWRAppDelegate.o y continuar con la compilación. Copie la ruta completa mencionada en el mensaje de error y péguela detrás de un comando 'rm' en su terminal. No es necesario limpiar / reconstruir, eliminar datos derivados, agregar / eliminar el archivo del proyecto, etc.

Jason Pepas
fuente
-1

Paso 1. Vaya a: Proyecto> Configuración de compilación> Rutas de búsqueda

Paso 2. Establezca "Buscar siempre rutas de usuario" en Sí

Paso 3. Construya el proyecto (recibirá una advertencia pero el proyecto se construirá).

Paso 4. Vuelva a establecer "Buscar siempre rutas de usuario" en No y compile de nuevo para eliminar la advertencia

tland
fuente
Solo puedo agregar esto para otros que encuentren esta respuesta. "Buscar siempre la ruta del usuario" ha quedado obsoleto a partir de Xcode 8.3 y en la documentación también dice "Se recomienda deshabilitarlo". (Es decir, configurándolo en NO)
Groot
-1

Una reconstrucción limpia no se realizó en mi caso, así que explico cómo resolví el problema:
- Se eliminó la referencia al archivo (no elimine el archivo)
- Agregue el archivo al proyecto nuevamente y ejecute

David Santiago
fuente
Un voto negativo requiere una explicación, funcionó para mí y podría funcionar para cualquier otra persona
David Santiago