variável de exportação de biblioteca estática C ++
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?
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?