Pregunta

Estoy tratando de crear una biblioteca de C ++ para usar en Windows / MSVC.

Mi problema es que parece que para vincular correctamente, necesito distribuir un montón de versiones diferentes, vinculadas con diferentes versiones de los tiempos de ejecución c ++ de MSVC: un solo y multiproceso, depurar y liberar, diferentes versiones del compilador, varios otra seguridad y otras opciones.

Me encantaría distribuir quizás dos, 32 bits y 64 bits.

Mi idea es quizás usar un nuevo operador diferente (por ejemplo, mynew) y asignadores personalizados para todos mis tipos de STL. Al crear la lib, / nodefaultlib. Luego, cuando se vincule desde un proyecto principal, pídales que agreguen mynew a new, y mi stl allocator al estándar (o uno de su elección). Supongo que necesitaría eliminar y algunas otras funciones. Naturalmente, proporcionaría un ejemplo de implementación de thunking con la biblioteca, pero espero que esto les ahorre a todos mucho dolor de cabeza.

¿Es esto posible? ¿Alguien ha probado esto? ¿Hay mejores prácticas para la creación / distribución de bibliotecas en Windows / MSVC?

¿Fue útil?

Solución

Desea vinculación estática, como respuesta general.

Nota rápida sobre la respuesta de Chris (no quiero reducir el impulso porque es principalmente bueno, pero ...):

NO enlace a msvcrt.dll (el no versionado); esta es la versión específica del sistema operativo DLL, y si la vincula, su aplicación probablemente no funcionará en otras versiones de Windows. Siempre debe estar vinculado a msvcrt ##. Dll, que yo sepa. El DDK puede contener una lib, pero no lo enlace a menos que realmente sepa lo que está haciendo.

Otros consejos

Enlace estático a la biblioteca de tiempo de ejecución de C ++:

  1. Abrir propiedades del proyecto.
  2. Vaya a Propiedades de configuración | C / C ++ | Sección de generación de código.
  3. Establezca la Biblioteca de tiempo de ejecución en Multi-thread (/ MT).

No necesita usar un asignador personalizado si está usando C ++, y ajusta todas las asignaciones alrededor de std :: tr1 :: shared_ptr (donde puede especificar una función de desasignación). Esto garantiza que incluso cuando los clientes liberan la última referencia al puntero compartido, aún se codifica en su biblioteca (o CRT de su biblioteca) cuando se libera el objeto.

Esta es una forma de resolver el "infierno de límites de DLL". ¡Espero eso ayude! :-)

Editar: creo que leí mal la intención de su pregunta. En lugar de no querer depender de un CRT porque le preocupa el infierno de límites de DLL, supongo que solo quería una versión de su DLL que pueda instalar en cualquier lugar. En ese caso, puede hacer que su programa se vincule a msvcrt.dll . Eso está disponible en cualquier sistema Windows.

No escuchaste esto de mí, pero aparentemente en el Kit de desarrollo de controladores puedes encontrar algún tipo de biblioteca de importación que permite que las versiones más recientes de Visual Studio se vinculen a msvcrt .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top