2009-08-22 7 views
5

Cuando suelo utilizar código (incluir encabezados) de bibliotecas C++ de terceros (no estándar), un archivo binario precompilado está vinculado (o incluido) al ejecutable de destino que representa mi aplicación, pero lo que sucede con C++ estándar ¿Biblioteca ?, hasta donde he visto, no tengo que enviar una biblioteca con una aplicación que usa código solo de la biblioteca estándar de C++. ¿El código está vinculado de forma estática e incluido en el ejecutable?¿Cómo se vincula la biblioteca estándar de C++ a mi aplicación?

Respuesta

11

No, las bibliotecas estándar están vinculadas dinámicamente de forma predeterminada en el tiempo de ejecución.

Al ejecutar el cargador dinámico se verá en un par de lugares estándar para las bibliotecas dinámicas si encuentra que se carga y se ejecuta de lo contrario la aplicación se cierra.

en sistemas Unix:
/usr/lib: Buscar: libstdC++ *

En Windows:
c: \ windows \ system32 mirada para: MSVCRT.DLL

También hay un par de variables de entorno que pueden afectar la ruta de búsqueda. Mire la página del manual de plataformas para dlopen para ver cuáles son. Todo lo que necesita debe estar en las páginas man para dlopen en su plataforma.

mayoría de los sistemas tienen estas librerías en los lugares adecuados y automáticamente se encontraron.
El resto de la STL no presentará dependencias de bibliotecas compartidas adicionales.

+2

El directorio es 'c: \ windows \ system32'. Al menos ahí es donde se guardan los tiempos de ejecución de Visual Studio. Sin embargo, no creo que MinGW los vincule. – avakar

+3

Y para agregar a eso, mingw vincula tu aplicación a su biblioteca estándar de C++ estáticamente. – nos

+4

Esta respuesta no es del todo correcta. libstdC++ no es lo mismo que MSVCRT.DLL. La última es la biblioteca * c *, la primera es la biblioteca * C++ *. Es cierto que cada binario producido por MinGW dependerá de MSVCRT.dll, pero eso en realidad no tiene nada que ver con la pregunta que se hizo. Como señalo a continuación, y como nos señala en el comentario anterior, la biblioteca libstdC++ se vincula por defecto de forma estática con el ejecutable. –

1

La mayor parte de todo está en los archivos de encabezado, porque está tan fuertemente modelado. Muy poco requiere libstdc++.so (iostream, puede ser, creo).

+2

STL es principalmente archivos de encabezado. La biblioteca estándar incluye otras cosas. –

+0

Todos los C++ requieren libstdC++. Tiene algunas funciones esenciales allí requeridas por el estándar. –

3

La única dependencia de tiempo de ejecución básica para los programas MinGW C++ está en MSVCRT.DLL. Otras dependencias dependerán de lo que realmente haga su programa; por ejemplo, si utiliza la conectividad de base de datos ODBC, dependerá de ODBC32.DLL (y probablemente algunas otras DLL de Windows). Sin embargo, el uso de clases como std :: string o std :: vector en un programa MinGW C++ no introducirá nuevas dependencias de bibliotecas dinámicas.

Si usted está preocupado por dependencias de bibliotecas dinámicas, echa un vistazo a la función "Dependency Walker" en http://www.dependencywalker.com/

6

En reciente MinGW gcc/g ++ versiones (4.40) se puede enlazar con un archivo DLL compartida en lugar de la estática por defecto biblioteca utilizando el marcador -shared-libstdC++.

Las versiones estáticas de la biblioteca se encuentran en/mingw/lib/gcc/mingw32/[versión de gcc]. El nombre del archivo es libstdC++. A. Esto se vinculará de forma predeterminada al compilar una aplicación de C++ con MinGW.

+3

El valor predeterminado para MinGW parece haber cambiado, al menos en mi sistema está vinculando contra libstdC++ - 6.dll de manera predeterminada. Se puede desactivar con un indicador '-static-libstdC++'. – rustyx

+0

@rustyx que es bueno saber. Siéntete libre de editar mi respuesta para reflejar eso (y dale a la respuesta un voto ascendente para que flote hasta la cima;) –

+0

@rustyx Probé -static-libstdC++ (y -static-libgcc) y aun así mi programa todavía enlaza dinámicamente al bibliotecas mingw libstd * .dll. Estoy compilando de forma cruzada, ¿alguna idea de por qué? –

1

Las bibliotecas en tiempo de ejecución de C y C++ se vinculan de la misma manera que las bibliotecas normales, la principal diferencia es que normalmente se compilan y vinculan automáticamente con el compilador y el vinculador sin necesidad de especificarlas.

es incorrecto sin embargo, generalizar que usted no tiene que enviar con su aplicación. En la mayoría de los casos en que envíe archivos binarios enlazados dinámicamente, deberá incluirlos; por ejemplo, si compila con MSVC++, enlazará con lo que esté instalado en su máquina de compilación, si instala el archivo binario enlazado dinámicamente en una nueva instalación de Windows, es probable que tenga problemas a menos que se asegure de que las bibliotecas estén incluidas como parte del paquete de instalación (consulte la documentación sobre los redistribuibles de Visual Studio). Lo mismo es cierto en las máquinas Solaris (las bibliotecas estándar se actualizan como parte de un conjunto de parches).Con Linux, es más complicado, no se puede vincular estáticamente debido a la GPL, sin embargo, las bibliotecas generalmente se instalan a través de paquetes de distribución.

+0

Buena respuesta, sin embargo, estaba hablando de mingw, que conecta las bibliotecas estándar estáticamente ... – Lawand

Cuestiones relacionadas