c++ visual-c++ compiler-errors static-libraries command-line-arguments

c++ - ¿Es posible crear una biblioteca estática(archivo.lib único) que luego pueda compilarse con/MT,/MTd,/MD o/MDd?



visual-c++ compiler-errors (3)

Puede usar una DLL en lugar de Lib. Una DLL forma un dominio de enlace separado. Las DLL con diferentes tiempos de ejecución / compiladores pueden mezclarse fácilmente.

En lugar de crear 4 libs diferentes (una para MT, MTd, MD, MDd ), quiero crear una lib que no especifique su dependencia en la biblioteca de tiempo de ejecución de C (CRT).

Traté de pasar la opción "/ c / Zl" al compilador vc10, luego / NODEFAULTLIB al comando lib. Más tarde, cuando uso tal lib, todavía tengo errores cuando compilo mi programa con un cambio diferente al predeterminado / MT. eg / MD aquí hay algunos primeros errores:

msvcprt.lib(MSVCP100.dll) : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct st d::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (__cdecl*)(class std::basic_ostream<char,struct std::char_tra its<char> > &))" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z) already defined in lib.lib(lib.obj) msvcprt.lib(MSVCP100.dll) : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::endl(class std::basic_ostream<char,stru ct std::char_traits<char> > &)" (?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z) already defined in lib.lib(lib.obj)

¿Es posible crear una biblioteca estática (archivo .lib único) que pueda compilarse posteriormente en los programas finales con / MT, / MTd, / MD o / MDd?


Una idea sería no utilizar ninguna función CRT.


Normalmente hubiera dicho que / MT / Zl son las opciones importantes para tener que hacer un archivo lib ''neutral''.

El problema aquí es que hay algún tipo de conflicto en c ++ en lugar de c runtime. Parece que ha decidido agregar las realizaciones de algunas clases de plantilla al archivo lib.lib, y uno puede entender por qué, en una compilación / MT le ha dicho al compilador que las DLL de c-runtime no pueden usar el formularios precompilados de las instancias de plantillas comunes, de modo que los archivos de encabezado STL elegirán la variante que se integra.

Posiblemente haya algunas definiciones de macro adicionales que controlan cómo los archivos de encabezado STL eligen exponer su funcionalidad. Sin saber lo que son, parece que la regla simple es: en realidad no se puede crear una lib neutral de ejecución si se usa el STL.