Vinculación estática y Dinámica / Compartida con MinGW


Quiero comenzar con un simple uso de enlaces para explicar mi problema. Supongamos que hay una biblioteca z que podría compilarse en la biblioteca compartida libz.dll(D:/libs/z/shared/libz.dll) o a la biblioteca estática libz.a (D:/libs/z/static/libz.un).

Quiero enlazar contra ella, entonces hago esto:

gcc -o main.exe main.o -LD:/libs/z/static -lz

De acuerdo con esta documentación, gcc buscaría libz.a, que es

Archivos de archivo cuyos miembros son archivos objeto

I también puede hacer lo siguiente:

gcc -o main.exe main.o -LD:/libs/z/shared -lz

No se menciona en la documentación anterior que -l flag buscará lib<name>.so.

¿Qué pasará si libz.a y libz.dll estará en el mismo directorio? ¿Cómo se vinculará la biblioteca con un programa? ¿Por qué necesito las banderas -Wl,-Bstatic y -Wl,-Bdynamic si -l busca bibliotecas compartidas y estáticas?

Por qué algunos desarrolladores proporcionan .a archivos con .archivos dll para los mismos módulos, si compilo una biblioteca compartida distribución?

Por ejemplo, Qt proporciona.archivos dll en el directorio bin con .a archivos en el directorio lib. ¿Es la misma biblioteca, pero construida como compartida y estática, respectivamente? O .a los archivos son algún tipo de bibliotecas ficticias que proporcionan enlaces con bibliotecas compartidas, donde hay implementaciones de bibliotecas reales?

Otro ejemplo es la biblioteca OpenGL en Windows. Por qué cada compilador debe proporcionar la lib OpenGL estática como libopengl32.¿a en MinGW?

Con qué son los archivos .DLL.un y. la extensiones utilizadas para?

P.d. Hay muchas preguntas aquí, pero creo que cada una depende de la anterior y no hay necesidad de dividirlas en varias preguntas.

Author: Alexander Shukaev, 2013-04-06

1 answers

Por favor, echa un vistazo a ld y WIN32 (cygwin/mingw). Especialmente, la sección enlace directo a una dll para obtener más información sobre el comportamiento de -l marca en los puertos de Windows de LD. Extracto:

Por ejemplo, cuando se llama a ld con el argumento-lxxx intentará encontrar, en el primer directorio de su ruta de búsqueda,

libxxx.dll.a
xxx.dll.a
libxxx.a
cygxxx.dll (*)
libxxx.dll
xxx.dll

Antes de pasar al siguiente directorio en la ruta de búsqueda.

( * ) En realidad, esto no es cygxxx.dll pero de hecho es <prefix>xxx.dll, donde <prefix> se establece por la opción ld -dll-search-prefix=<prefix>. En el caso de cygwin, el archivo estándar gcc spec incluye -dll-search-prefix=cyg, por lo que en realidad buscamos cygxxx.dll.

NOTA: Si alguna vez ha construido Boost con MinGW, probablemente recuerde que el nombre de las bibliotecas Boost obedece exactamente al patrón descrito en el enlace anterior.

En el pasado hubo problemas en MinGW con enlaces directos a *.dll, por lo que se recomendó crear una biblioteca estática lib*.a con símbolos exportados desde *.dll y enlazados en su lugar. El enlace a esta página wiki de MinGW ahora está muerto, así que asumo que debería estar bien enlazar directamente contra *.dll ahora. Además, lo hice yo mismo varias veces con la última distribución MinGW-w64, y todavía no tuve problemas.

Necesita banderas de enlace -Wl,-Bstatic y -Wl,-Bdynamic porque a veces desea forzar el enlace estático, por ejemplo, cuando la biblioteca dinámica con el mismo nombre también está presente en una ruta de búsqueda:

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output

El el fragmento anterior garantiza que la prioridad de enlace predeterminada de -l flag se anula para MyLib1, es decir, incluso si MyLib1.dll está presente en la ruta de búsqueda, LD elegirá libMyLib1.a para vincular. Observe que para MyLib2 LD volverá a preferir la versión dinámica.

NOTA: Si MyLib2 depende de MyLib1, entonces MyLib1 también está enlazado dinámicamente, independientemente de -Wl,-Bstatic (es decir, se ignora en este caso). Para evitar esto tendrías que enlazar MyLib2 estáticamente también.

 27
Author: Alexander Shukaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-09 19:43:33