Pergunta

Eu tenho uma biblioteca estática escrito em C ++ e eu tenho uma estrutura que descreve o formato de dados, ou seja,

struct Format{
    long fmtId;
    long dataChunkSize;
    long headerSize;

    Format(long, long, long);

    bool operator==(Format const & other) const;
};

Alguns dos formatos de dados são amplamente utilizados, como {fmtId=0, dataChunkSize=128, headerSize=0} e {fmtId=0, dataChunkSize=256, headerSize=0}
Algumas classes de estrutura de dados receber formato no construtor. Eu gostaria de ter algum tipo de atalhos para esses formatos amplamente utilizados, como um par de membros globais Format gFmt128, gFmt256 que eu possa passar por referência. I instanciar-los em um arquivo .cpp como

Format gFmt128(0, 128, 0);

e em .h existe

extern Format gFmt128;

Também, declaro Format const & Format::Fmt128(){return gFmt128;} e tentar usá-lo no módulo principal.

Mas se eu tentar fazê-lo no módulo principal que usa o lib, o vinculador reclama gFmt128 externo não resolvido.

Como posso fazer minha biblioteca 'exportar' essas vars globais, para que eu possa usá-los de outros módulos?

Foi útil?

Solução

Não use a palavra-chave estática em declarações globais. Aqui está um artigo explicar a visibilidade das variáveis ??com / sem estática. A estática dá globals ligação interna, isto é, visível apenas na unidade de tradução são declarados no.

Outras dicas

Eles estão definidos no arquivo .cpp bem? Grosso modo, ele deve ser parecido:

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }

Você precisa declarar seus objetos formato externo não estática

Morhveus, eu tentei isso também. Meu vinculador vez diz que tem o símbolo gFmt128 já definido. Este é realmente o comportamento que eu esperaria:. O compilador acrescenta o corpo da função para a biblioteca e o objeto cliente, uma vez que está definido no arquivo de inclusão

A única maneira de eu conseguir externos não resolvidos é por

  • não adicionando a biblioteca estática para os objetos-a-ser-linked
  • não definir o símbolo gFmt128 no arquivo de origem da biblioteca estática

Estou perplexo ... Como é que vemos algo diferente? Você pode explicar o que acontece?

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