Pregunta

Tengo un miembro de la clase estática

class bar {...}

class foo {
    public:
        static QHash<qint64,bar>* barRepHash;
}

Ahora me llama a una función que accede a este miembro dentro de una biblioteca compartida, aparece un error de memoria mientras que cuando accedo a la función a través del programa principal, que funciona bien. He probado esto bajo una serie de circunstancias.

Me inicializar la variable en la aplicación principal, pero no inicializar de nuevo en la biblioteca compartida (parecía innecesario).

Estoy usando GCC y QT en Ubuntu.

¿Qué va y cómo puedo solucionarlo?

¿Fue útil?

Solución

IIRC el exe y biblioteca compartida obtendrán sus propias copias de las variables miembro estáticas como esa, y que, como tal, tendrá que inicializar por separado en cada caso.

Ya que es un puntero, una forma puede ser para inicializar en su programa principal como normal y luego pasar el puntero a la DLL cuando es colocada de modo que la versión de la DLL se puede configurar para que apunte al mismo lugar que los exe uno.

EDIT: Ok, hice algunas pruebas (Windows, VC9), y parece que las variables globales y variables estáticas (ya sea la función, clase, lo que sea) son por módulo (es decir, cada EXE y DLL recibe su propia copia, incluso si la variable provenía de una fuente común, como decir una biblioteca estática).

Voy a probar para ver si el dllimport / exportación de la clase hace uso de una copia común.

Edit2:

Ok usando __declspec (dllexport) en el DLL y __declspec (dllimport) en el exe (macros uso del preprocesador para cambiar entre ellos en función de lo que incluye la cabecera), para la declaración de la variable estática hizo la variable estática común a los dos módulos. También funciona para las variables globales, y voy a asumir que las variables de función estáticas.

#pragma once

//defined when compiling test.dll
#ifdef TEST_EXPORTS
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif

//foo and bar definition in test.cpp, ie only in the dll's compile
class X
{
public:
    static int foo;
};
DLL extern int bar;

Sin embargo yo sepa GCC no tiene dllexport y dllimport, sin embargo, puede tener alguna otra forma de lograr los mismos efectos al crear librerias compartidas (ya sea una DLL o algo así).

Si no es así, entonces la única otra solución que se me ocurre es lo que primero sugirió. Inicializar el puntero estático en el exe, y luego tener una función en el DLL para ajustar la potencia reactiva, que el exe puede llamar pasando su copia del puntero.

Otros consejos

Mediante el uso de "sección" atributos se pueden colocar en secciones específicas, aparte de los datos y la BSS. Sólo en las ventanas de estas secciones se pueden compartir entre ejecutable mediante el atributo "compartida". En otras plataformas no es compatible con esta característica. Así que la solución sería tal como se mencionó en la respuesta anterior.

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