Pregunta

Tengo un mensaje de error realmente extraño que solo aparece cuando agrego la siguiente línea a mi proyecto:

std::list<CRect> myVar;

Vale la pena señalar que no tiene que ser una lista std :: list, puede ser std :: vector o cualquier otro contenedor STL que asumo.

Aquí está el mensaje de error:

  

Error 1 error LNK2005: " public:   __thiscall std :: list

     
    

:: lista > (nulo) "     (?? 0? $ List @ VCRect @@ V? $ Allocator @ VCRect @@@ std @@@ std @@ QAE @ XZ)     ya definido en     SomeLowLevelLibrary.lib

  

La biblioteca de bajo nivel a la que se hace referencia en el mensaje de error no tiene idea del proyecto que estoy construyendo, solo tiene una funcionalidad básica de bajo nivel y no se ocupa de las GUI de MFC de alto nivel.

Puedo hacer que el error del enlazador desaparezca si cambio la línea de código a:

std::list<CRect*> myVar;

Pero no quiero piratearlo por el simple hecho de hacerlo.

Además, no importa si creo la variable en la pila o en el montón, todavía obtengo el mismo error.

¿Alguien tiene alguna idea sobre esto? Estoy usando Microsoft Visual Studio 2008 SP1 en Vista Enterprise.

Editar: El error del enlazador anterior es para std :: list < > constructor, también recibo un error para el destructor, _Nextnode y funciones claras.

Editar: En otros archivos del proyecto, std :: vector no se vinculará, en otros archivos podría ser std :: list. No puedo entender por qué algunos contenedores funcionan y otros no. El enlace MFC es estático en ambas bibliotecas. En la biblioteca de bajo nivel tenemos 1 clase que hereda de std :: list.

Editar: La biblioteca de bajo nivel no tiene ninguna clase que herede de CRect, pero hace uso de STL.

¿Fue útil?

Solución 2

Recientemente me topé con este error nuevamente en nuestro proyecto y decidí tener una investigación más exhaustiva en comparación con solo repararlo con un hack como la última vez (intercambie std :: list por CArray). Resulta que una de nuestras bibliotecas de bajo nivel estaba heredando de std :: list, por ejemplo

class LIB_EXPORT CRectList : public std::list<CRect>
{
};

Esto no es solo una mala práctica, sino que también fue la causa de los errores del enlazador en la aplicación principal. Cambio CRectList para envolver std :: list en lugar de heredar de él y el error desapareció.

Otros consejos

Deberías estar mirando la configuración del enlazador, pero no puedo decir inmediatamente cuál. Es normal que las instancias de STL se realicen en varios archivos. El enlazador debe elegir uno. Todos son idénticos (suponiendo que tenga una configuración de compilador consistente).

Esto no parece el síntoma exacto, pero para asegurarse de que debe verificar que su proyecto principal y todas sus bibliotecas incluidas usen la misma '' Biblioteca de tiempo de ejecución '' configurando bajo "C ++: Generación de código". Mezclar estas configuraciones puede crear errores de enlace de biblioteca en tiempo de ejecución (Lo que me confunde en su caso es que puede hacer que desaparezca cambiando el código, pero vale la pena verificar si aún no lo ha hecho).

¿SomeLowLevelLibrary.lib contiene o usa alguna clase llamada CRect? ¿Utiliza STL?

¿Se incluye el archivo en un encabezado que podría compilarse en dos módulos de código separados?

Otra posibilidad aleatoria apareció en mi cabeza hoy. ¿Es posible que su DLL actual y su biblioteca de bajo nivel hagan referencia a dos versiones diferentes de MFC? Tiro largo.

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