¿Cuál es la diferencia entre un archivo .o y un archivo .lib?¿Cuál es la diferencia entre un archivo .o y un archivo .lib?
Respuesta
archivo Un .LIB es una colección de archivos OBJ concatenados junto con un índice . No debe haber diferencia en cómo trata el enlazador tampoco.
Citado desde aquí:
What is the difference between .LIB and .OBJ files? (Visual Studio C++)
en realidad son muy diferentes, especialmente con enlazadores mayores.
Los archivos .o (o .obj) son archivos objeto, contienen el resultado del código generado por el compilador. Todavía está en un formato intermedio, por ejemplo, la mayoría de las referencias aún no están resueltas. Por lo general, hay una asignación de uno a uno entre el archivo de origen y el archivo de objeto.
Los archivos .a (o .lib) son archivos, también conocidos como biblioteca, y son un conjunto de archivos de objeto.
Todos los sistemas operativos tienen herramientas que le permiten agregar/eliminar/enumerar archivos de objeto a archivos de biblioteca.
Otra diferencia, especialmente con los enlazadores más antiguos es la forma en que se tratan los archivos, al vincularlos. Algunos enlaces colocarán el archivo de objeto completo en el binario final, independientemente de lo que realmente se esté usando, mientras que solo extraerán la información útil de los archivos de la biblioteca.
Hoy en día, la mayoría de los enlazadores son lo suficientemente inteligentes como para eliminar todo lo que no se está utilizando.
La última oración es en gran parte falsa. –
Los dos últimos párrafos son falsos. A menos que esté hablando de enlazadores desde antes de 1960 antes de que cosas como esta estuvieran estandarizadas. –
Conceptualmente, una unidad de compilación (la unidad de código en un archivo de origen/archivo de objeto) está vinculada por completo o no está en absoluto. Aunque algunas implementaciones, con niveles significativos de cooperación entre el compilador y el enlazador, pueden eliminar el código no utilizado de los archivos objeto en tiempo de enlace, no cambia el problema que incluye 2 unidades de compilación con nombres de símbolo conflictivos en un programa un error.
Como ejemplo práctico, supongamos que su biblioteca tiene dos funciones foo
y bar
y están juntas en un archivo de objeto. Si quiero usar bar
, pero mi programa ya tiene un símbolo externo llamado foo
, me encuentro con un error. Incluso si o cómo la implementación podría resolver este problema para mí, el código sigue siendo incorrecto.
Por otro lado, si tengo un archivo de biblioteca que contiene dos archivos de objetos separados, uno con foo
y el otro con bar
, sólo el uno que contiene bar
obtendrá tirado en mi programa.
Al escribir bibliotecas, debe evitar incluir varias funciones en el mismo archivo de objeto a menos que sea esencial que se utilicen juntas. Si lo hace, aumentará las aplicaciones que vinculan su biblioteca (estáticamente) y aumenta la probabilidad de conflictos de símbolos. Personalmente prefiero equivocarme en el lado de los archivos separados cuando hay una duda; incluso es útil poner foo_create
y foo_free
en archivos separados si este último no es trivial, por lo que los programas puntuales que no necesitan llamar al foo_free
pueden evitar tirar el código para la liberación profunda (y posiblemente incluso evitar tirar en la implementación de free
sí mismo).
- 1. ¿Cuál es la diferencia entre un archivo de objeto .o y un archivo de biblioteca .so?
- 2. ¿Cuál es la diferencia entre. y # en un archivo css?
- 3. ¿Cuál es la diferencia entre un archivo .cpp y un archivo .h?
- 4. ¿Cuál es la diferencia entre los archivos .lib y .a?
- 5. ¿Cuál es la diferencia entre abrir un archivo con ios :: binary o ios :: out o ambos?
- 6. ¿Cuál es la diferencia entre .sqlite y el archivo .db?
- 7. ¿Cuál es la diferencia entre: = y + = en el archivo make?
- 8. Diferencia entre el archivo .o y .ko
- 9. Diferencia entre un archivo empaquetado y un archivo descompuesto
- 10. ¿Cuál es la diferencia entre un archivo .xib y un .storyboard?
- 11. Para el comando cmake "incluir", ¿cuál es la diferencia entre un archivo y un módulo?
- 12. ¿Cuál es la diferencia entre los archivos .dll, .lib, .h?
- 13. ¿Cuál es la diferencia entre un archivo de solución MonoDevelop y un archivo de solución de Visual Studio?
- 14. En Perl, ¿cuál es la diferencia entre un archivo .pm (módulo Perl) y un archivo .pl (script Perl)?
- 15. ¿Cuál es la diferencia entre un árbol y un directorio?
- 16. ¿Cuál es la diferencia entre la vía y la ruta de un archivo GPX
- 17. ¿Cuál es la diferencia entre un predicado y un funcionador?
- 18. ¿Cuál es la diferencia entre un algoritmo y un método
- 19. ¿cuál es la diferencia entre -C y gzipping un mysqldump?
- 20. ¿Cuál es la diferencia entre un lenguaje y un marco?
- 21. ¿Cuál es la diferencia entre un controlador y un servicio?
- 22. ¿Cuál es la diferencia entre el archivo objeto y la biblioteca estática (archivo)?
- 23. ¿Cuál es la diferencia entre el archivo app.config y el archivo XYZ.settings?
- 24. ¿Cuál es la diferencia entre un método y un selector?
- 25. Cuál es la diferencia entre un subproceso y un controlador
- 26. ¿Cuál es la diferencia entre un ayudante y un parcial?
- 27. ¿Cuál es la diferencia entre un nanokernel y un exokernel?
- 28. ¿Cuál es la diferencia entre un HashMap y un TreeMap?
- 29. ¿Cuál es la diferencia entre un vector y un vértice?
- 30. ¿Cuál es la diferencia entre un REPL y un intérprete?
en términos de qué? ¿formato de archivo? ¿uso? ¿fuente? – tenfour