De vuelta en la década de los 90, cuando empecé a salir con MFC he utilizado para vincular dinámicamente mis aplicaciones y se envían los correspondientes archivos Dll de MFC. Esto me causó algunos problemas (DLL hell!) y me cambié a enlazar estáticamente en su lugar – no sólo para MFC, pero para el CRT y ATL. Otra de las grandes archivos EXE, enlazar estáticamente nunca me ha causado ningún problema en absoluto – entonces, ¿hay alguna desventajas que otras personas han llegado a través de? Hay una buena razón para volver a visitar la vinculación dinámica de nuevo? Mis aplicaciones son principalmente de STL/Boost hoy en día por lo que vale.

InformationsquelleAutor Rob | 2008-10-26

7 Comentarios

  1. 17

    Existen algunos inconvenientes:

    • Más grande exe tamaño (esp si envía varios exe)
    • Problemas utilizando otros archivos DLL que confiar, o asumir la vinculación dinámica (por ejemplo: 3ª parte de los archivos DLL que no puede obtener como bibliotecas estáticas)
    • Diferentes c-tiempos de ejecución entre DLL con la estática independiente de vinculación (no la cruz-módulo de asignar/desasignar)
    • Ningún mantenimiento automático de componentes compartidos (sin capacidad de tener 3ª parte del módulo de proveedores actualización de su código para solucionar los problemas sin necesidad de volver a compilar y actualización de su aplicación)

    Hacemos la vinculación estática para nuestras aplicaciones de Windows, principalmente porque permite la implementación de xcopy, que es no sólo posible con la instalación o confiando en SxS DLL en una manera que funciona, ya que el proceso y el mecanismo no está bien documentado o fácilmente utilizables. Si el uso local de DLL en el directorio de instalación es un poco de trabajo, pero no es muy compatible. La incapacidad para realizar fácilmente la instalación remota sin necesidad de pasar por una MSI en el sistema remoto es la principal razón por la que no uso la vinculación dinámica, pero (como se señaló) hay muchos otros beneficios para la vinculación estática. Hay pros y contras para cada uno; esperemos que esto ayuda a enumerarlos.

  2. 19

    La mayoría de las respuestas que he oído acerca de este implicar la divulgación de la dll con otros programas, o con los dll ser actualizado sin la necesidad de revisión de su software.

    Francamente considero que los aspectos negativos, no beneficios. Cuando es un tercero el archivo dll se actualiza, puede cambiar suficiente para romper su software. Y en estos días, espacio de disco duro no es tan valioso como lo fue una vez, un extra de 500 k en tu ejecutable? A quién le importa?

    • Estar 100% seguro de la versión de la dll de que su software está utilizando es una buena cosa.
    • Estar 100% seguro de que el cliente no va a tener una dependencia dolor de cabeza es una buena cosa.

    Los beneficios superan a los inconvenientes, en mi opinión,

  3. 4

    Siempre y cuando usted mantenga su uso se limita a ciertas bibliotecas y no utilizar cualquier archivo dll que, a continuación, usted debe ser bueno.

    Por desgracia, hay algunas bibliotecas que no se puede vincular de forma estática. El mejor ejemplo que tengo es OpenMP. Si usted toma ventaja de Visual Studio OpenMP apoyo, usted tendrá que asegurarse de que el tiempo de ejecución está instalado (en este caso vcomp.dll).

    Si usted utiliza dll, entonces usted no puede pasar algunos elementos de ida y vuelta sin algunos problemas graves de gimnasia. std::cadenas vienen a la mente. Si el archivo exe y dll están vinculados dinámicamente, a continuación, la asignación se lleva a cabo en en el CRT. De lo contrario, el programa puede tratar de asignar la cadena en un lado y desasignar en el otro. Cosas malas sobrevenir…

    Que dijo, yo todavía estáticamente enlace de mi exe y dll. Se reduce mucho el variablilty en la instalación y considero que bien vale la pena los pocos limitaciones.

    • La cosa acerca de la asignación de memoria no es correcta. Cuando se utiliza el archivo DLL CRT, sólo hay un CRT presentes en la aplicación, de modo que usted puede asignar desde una DLL y desasignar en el otro, es que todos vamos para el mismo montón, ya que es el mismo de la CRT.
    • Cierto, pero si el exe y el archivo dll son tanto vinculado estáticamente, a continuación, hay dos montones. A la derecha? Al menos esa ha sido mi experiencia. Tengo que decirte, siendo capaz de pasar de un std::string de ida y vuelta o un vector habría hecho mi vida mucho más fácil.
    • La solución para el std::string problema no está vacilando. Vincular de forma estática o vincular dinámicamente. Si usted tiene comió menos una DLL de C++, enlace en contra de la CRT DLL.
  4. 2

    Una buena característica de utilizar dll se que si varios procesos cargas de la misma dll su código puede ser compartido entre ellos. Esto puede ahorrar memoria y acortar los tiempos de carga para una carga de la aplicación de una dll que ya utilizado por otro programa.

    • Que puede guardar la memoria del sistema por la página de la deduplicación, pero el proceso individual de espacio de direcciones virtuales es realmente reducida, en lugar de sólo las partes de una biblioteca tirado en un archivo ejecutable que tiene toda la biblioteca asignado al espacio de direcciones del proceso. Con varios archivos Dll asignado y con ASLR, proceso de espacio de direcciones virtuales se presenta fragmentado, lo que al menos para las aplicaciones de 32 bits reduce considerablemente el tamaño del bloque de memoria contigua que puede ser asignado.
  5. 1

    Definitivamente.

    Asignación se hace en un «estático» del montón. Desde la asignación de una cancelación debe ser hecho en el mismo montón, esto significa que si usted envía una biblioteca, usted debe tener cuidado de que el código de cliente no se puede llamar ‘su’ p = new LibClass() y eliminar ese objeto por sí mismo utilizando delete p;.

    Mi conclusión: cualquier escudo de asignación y desasignación de código de cliente, o vincular dinámicamente el CRT.

  6. 1

    Hay algunas licencias de software, tales como LGPL que requieran utilizar un archivo DLL o distribuir su aplicación como objeto de archivos que el usuario puede unir. Si usted utiliza una biblioteca, es probable que desee utilizar como un archivo DLL.

    • Si tenía uso de una biblioteca, usted puede pagar un rescate con el fin de enlace estático (en lugar de cargar la DLL).

Dejar respuesta

Please enter your comment!
Please enter your name here