2011-12-30 13 views
17

esto es muy confuso. Pasé mucho tiempo leyendo publicaciones sobre esto en la pila, etc. Aún estoy confundido.Compatibilidad de * .dll * .a * .lib * .def entre VisualStudio y gcc

Estoy usando Qt y C++ para la codificación. En Qt, estoy usando la opción gcc para un compilador.
El problema es que muchas bibliotecas de terceros que he probado no parecen funcionar.

Soy nuevo en archivos .dll, .a, .lib, .def y esquemas de biblioteca.

Pregunta 1:

En mi limitada experiencia (he tratado de 7 o 9 bibliotecas hasta ahora), proveedores de bibliotecas rara vez le indican si el archivo .dll se hizo con VisualStudio o GCC. Esto agrega mucha confusión. Casi nunca dejan en claro con qué compilador es compatible la biblioteca. Así que agradecería algunos consejos de la vida real de cómo lidiar con esta pesadilla. Casi todas las bibliotecas que probé son proyectos OpenSource. No nombraré nombres aquí, pero estos son proyectos bien conocidos. Estoy seguro de que el problema es mi falta de conocimiento ...

MinGW y gcc Mundial

Pregunta 2:
Por lo que yo puedo decir, dinámica C++ bibliotecas para MinGW gcc universo requieren de estos, a la derecha ?
* .h
* .dll
* .a

Pregunta 3:
Por desgracia, el archivo .a es a menudo ausente y la biblioteca no funciona. Esto es muy confuso Si falta el archivo .a, ¿no tengo suerte?

Pregunta 4:
¿Puedo generar el archivo .a para MinGW/gcc si el * .dll se hizo con gcc?

Pregunta 5: ¿Puedo generar el archivo .a para MinGW/gcc si el * .dll se hizo con VisualStudio?

Pregunta 6:
¿Es posible que un * .dll (hecho con MinGW/gcc) sea demasiado viejo y ya no sea compatible con los nuevos MinGW/gcc?

Pregunta 7:
Qt los proyectos que utilizan MinGW/gcc nunca necesitan archivos * .lib, ¿verdad? Eso es solo una cosa de VisualStudio, ¿verdad?

Pregunta 8:
No necesito un archivo * .def para usar un * .dll en un proyecto de Qt usando MinGW/gcc, ¿verdad?

VisualStudio Mundial

Pregunta 9:
Por lo que yo puedo decir, dinámica C++ bibliotecas para VisualStudio requieren los siguientes:
* .h
* .dll
* .lib

¿verdad? Nuevamente, el problema es que el archivo * .lib casi siempre falta. Además, no hay instrucciones claras sobre con qué compilador es compatible la biblioteca. Entonces, ¿cómo puedo saber si es solo para VisualStudio o no?

Pregunta 10:
Si falta el archivo .lib ¿no tengo suerte?

Pregunta 11:
¿Puedo generar el archivo .lib para VisualStudio si el * .dll se realizó con VisualStudio? ¿Cómo?

Pregunta 12:
¿Puedo generar el archivo .lib para VisualStudio si el * .dll se hizo con MinGW/gcc? ¿Cómo?

Pregunta 13:
¿Es posible que un * .dll (hecho con VisualStudio) sea demasiado viejo y ya no sea compatible con VisualStudio más nuevo?

Pregunta 14:
Si en QtCreator selecciono el compilador de VisualStudio, ¿es 100% compatible con bibliotecas dinámicas compiladas con REAL VisualStudio por otra persona? Creo que la opción del compilador de VisualStudio en Qt Creator es un compilador de VisualStudio falso.

Pregunta 15:
Si en QtCreator selecciono el compilador MinGW/gcc, puedo utilizar con las bibliotecas dinámicas Qt compilados con VisualStudio VERDADERO por otra persona?

Pregunta 16:
No necesito un archivo * .def para usar un * .dll en un proyecto de Qt usando MinGW/gcc, ¿verdad?

Pregunta 17: ¿Puedo convertir un * lib (que funciona con un * .dll y * .h) archivo hecho con REAL VisualStudio a un archivo * .a para que pueda utilizar el archivo * .a con el no modificado * .dll y * .h archivos en un proyecto Qt gcc?

+3

Creo que esta complejidad es peculiar de Windows. ¡No lo tendrás cuando uses Qt en Linux! –

+2

Es posible que desee dividir esto en varias preguntas (específicamente la variedad "¿Puedo generar X si tengo Y") ... probablemente muchas personas puedan responder algunas de estas preguntas y si las preguntas individualmente (ya que son bonitas) no relacionado con Qt) acerca de la vinculación de Windows, es posible que obtenga respuestas más rápidas. Dicho todo esto, la respuesta más breve que puedo darte es * no uses MinGW si no tienes que hacerlo * - VisualStudio es la norma admitida en la plataforma y tendrás una mejor experiencia a largo plazo (si algo de dolor en el corto plazo con las dependencias de la biblioteca de código abierto). –

+3

-1: para hacer 16 preguntas a la vez. –

Respuesta

3

Una DLL es esencialmente una aplicación compilada, simplemente en la forma de una biblioteca de funciones en lugar de un archivo EXE. Cualquier otra aplicación puede usar las funciones dentro de esa DLL simplemente declarando la función, la dll que contiene la función, y los parámetros y valores de retorno y tal.

Las DLL ya deben existir en un sistema si una aplicación se compila utilizando "bibliotecas dinámicamente vinculadas", por lo que debe incluir las DLL necesarias en su instalador o esperar que ya existan en la computadora de destino. Usar DLL hace que el tamaño de tu aplicación sea más pequeño en general.

Crear archivos DLL es como crear cualquier otra aplicación: solo debe apuntar a su compilación como una DLL en lugar de un EXE o lo que sea.

Para crear cualquier aplicación, DLL, EXE u otra, necesita el código fuente y los encabezados necesarios. Los archivos .h contienen declaraciones de funciones y tipos de datos y clases, y otras cosas; rara vez contienen código. A .def es muy parecido a .h, pero generalmente es un conjunto de instrucciones para un enlazador.

Cuando compila, a .h o .c o lo que sea se convierte en .obj - un archivo de objeto. Múltiples archivos de objeto están vinculados entre sí para crear su DLL o EXE.

Un archivo .lib es una biblioteca estática, esencialmente un conjunto de archivos .obj (o uno .obj) que se han combinado para la etapa de vinculación.

El formato de los archivos .obj y .lib puede ser particular para un compilador, y rara vez son compatibles entre los compiladores. Debe tener el código fuente original, o un .obj o .lib hecho específicamente para su compilador.

Cuando elige crear un EXE con "bibliotecas vinculadas dinámicamente", se esperan archivos DLL que pueda usar. Cuando eliges "bibliotecas vinculadas estáticamente", el vinculador localizará los archivos .lib que necesita antes de generar el EXE, y no necesitarás esos archivos DLL.

15

Tal vez vale la pena comenzar desde el principio y no adelantarse a nosotros mismos y describir el problema central. De estas respuestas a varias de las preguntas se pueden derivar.

El inicio es ABI (interfaz binaria de la aplicación). Esto define cosas como

  • cómo se llama una función, p. qué parámetros entran en qué registros o qué ubicación en la pila ponen
  • cómo se lanzan las excepciones
  • cómo se distribuyen los objetos, p. donde el "puntero vtable" va, lo que se usa relleno
  • cuán grande es la acumulación de los tipos de datos son
  • cómo los nombres de las funciones son "destrozado" en símbolos
  • cómo la información de tipo se organizada
  • la el diseño de las clases de la biblioteca estándar
  • etc.

mayoría de las plataformas C definen un traumatismo craneoencefálico pero no definen un C++ ABI. Como resultado, el compilador define su propio ABI (para todo, excepto el material C que normalmente está allí). Esto produce archivos objeto que son incompatibles entre compiladores diferentes (a veces incluso entre versiones del mismo compilador).

Normalmente, esto se manifiesta en nombres de aspecto extraño que de alguna manera no están definidos: diferentes ABI utilizan deliberadamente diferentes nombres para evitar accidentalmente la vinculación de un ejecutable que no funcionará de todos modos. Para evitar esto, su mejor apuesta es construir todos los componentes utilizando el mismo compilador.

Si desea determinar con qué compilador se compila una biblioteca, puede ver su contenido utilizando las herramientas adecuadas. Soy consciente de que usted pidió para Windows, pero sólo conozco las herramientas de UNIX (que pueden estar disponibles con MingW):

  • nm a mirar los nombres de símbolos (por lo general junto con menos o grep)
  • ar para construir o inspeccionar las bibliotecas
  • Ident para encontrar cadenas especiales incrustados en el objeto
  • cadenas de aficionado a todas las cadenas de
  • filt C++ para demangle símbolos en su declaración C++

Al observar los símbolos generalmente se obtienen identificaciones del compilador que los produjo. Si los ha visto con suficiente frecuencia, incluso puede decirle a la ABI desde los símbolos mismos.

Hay mucho más en esta área pero me he quedado sin energía ... :-) En cualquier caso, creo que esto responde a varias de las preguntas anteriores.

7

Me encontré con esta pregunta al buscar la herramienta para crear el archivo .a usando Code :: Blocks compilador de C++ para Windows. Código: Blocks usa el compilador MinGW gcc.Era lo suficientemente alto en Google para validar mi nigromancia, creo.

Las bibliotecas de vínculos dinámicos (dll) son un grupo mixto. Algunos se pueden compilar de una manera que los haga muy difíciles de usar fuera del lenguaje de programación y del compilador con el que se crearon.

A menudo, sin embargo, el dll se crea con una interfaz C limpia. Cuando ese es el caso, las respuestas a sus preguntas que creo que puedo responder son:

1: eso no es una pregunta.

2, 9: sí

3, 10: no

4, 11: sí. MinGW incluye una herramienta (dlltool.exe) que toma un archivo .dll y un archivo .def y crea un archivo .a MS VisualStudio también incluye una herramienta (que creo que se llama lib.exe) para hacer lo mismo. Y si comienza a usar otro compilador probablemente encontrará que también tiene una herramienta. Los compiladores de Borlands tenían la herramienta implib.exe.

5, 12: sí (igual que 4)

6, 13: banco ... No creo que hay una fecha de caducidad en los DLL pero debe ser compilado para el sistema operativo correcto.

8, 16: se necesita el .def para hacer el .ao .lib, si no lo tiene, en realidad es Posible para crear que desde el .dll

0

la pregunta 1: usted debe importe el archivo .h y enlace el archivo .a mediante el comando del enlazador y copie .dll cerca de su salida .exe.

la pregunta 2: usted puede hacer .a archivo por archivo .def

set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%PATH% 

dlltool.exe -d libfftw3-3.def -l libfftw3-3.a 

la pregunta 3: no. usted puede hacer el archivo .def manualmente y luego de hacer el archivo .a.

pregunta 4,5: Sí

la pregunta 6: Creo que es depende de su sistema de hardware y la operación no en su compilador.

pregunta 7: No sé.

pregunta 8: sólo se necesita .h.a.dll no .DEF

la pregunta 9: .lib archivos es para Visual Studio.

la pregunta 10: no se necesitan .def y .dll hacer .lib y usted puede hacer . def sí mismo si no lo tiene.

set PATH=C:\Program Files\Microsoft Visual Studio 12.0\VC\bin;%PATH% 

lib /machine:x86 /def:libfftw3-3.def 

o

lib /machine:x64 /def:libfftw3-3.def 

Pregunta 11: si te dije anteriormente.

la pregunta 12: Sí

la pregunta 13: no.

Cuestiones relacionadas