Pergunta

Eu tenho um membro da classe estática

class bar {...}

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

Agora eu chamar uma função que acessa esse membro, dentro de uma biblioteca compartilhada, eu recebo um erro de memória enquanto que quando eu acessar a função através do programa principal, ele funciona bem. Eu testei isso sob uma série de circunstâncias.

Eu inicializar a variável na aplicação principal, mas eu não intialize-lo novamente na biblioteca compartilhada (parecia desnecessário).

Eu estou usando GCC e QT no Ubuntu.

O que vai e como posso corrigir isso?

Foi útil?

Solução

IIRC o exe e biblioteca compartilhada terá suas próprias cópias de variáveis ??membro estático como esse, e que, como tal, será necessário inicializar-lo separadamente em cada caso.

Desde a sua um ponteiro, uma forma pode ser para inicializar-lo em seu programa principal como normal e, em seguida, passar o ponteiro para a dll quando você carregá-lo de modo que a versão da dll pode ser configurado para apontar para o mesmo local que os do exe um.

EDIT: Ok, eu fiz alguns testes (Windows, VC9), e parece que globals e variáveis ??estáticas (seja função, classe, qualquer que seja) são por módulo (ou seja, todos os exe e dll vontade recebe a sua própria cópia, mesmo que a variável veio de uma fonte comum, como diria uma biblioteca estática).

Vou teste para ver se o dllimport / exportação de classe torna usar uma cópia comum.

EDIT2:

Ok usando __declspec (dllexport) na DLL e __declspec (dllimport) na exe (macros uso de pré-processamento para alternar entre elas, dependendo do que inclui o cabeçalho), para a declaração variável estática feita a variável estática comum a ambos os módulos. Ele também trabalha para variáveis ??globais, e eu vou assumir variáveis ??função estática.

#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;

AFAIK GCC no entanto não tem dllexport e dllimport, no entanto, pode ter alguma outra forma de alcançar os mesmos efeitos ao criar libaries compartilhados (seja ele uma dll ou assim).

Se isso não acontecer, então a única solução que eu posso pensar é o que eu sugeri em primeiro lugar. Inicializar o ponteiro estático no exe, em seguida, ter uma função na DLL para definir o var estático, que o exe pode chamar passando a sua cópia do ponteiro.

Outras dicas

Ao usar atributos "Seção" pode ser colocado em seções específicas para além de dados e BSS. Apenas em janelas essas seções podem ser compartilhados entre executável usando o atributo "compartilhada". Em outras plataformas este recurso não é suportado. Portanto, a solução seria como mencionado na resposta anterior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top