Pergunta

Eu tenho um aplicativo que está usando uma biblioteca estática que eu fiz. Um arquivo .cpp na biblioteca tem uma declaração de variável estática, cujo ctor chama uma função em um singleton que faz alguma coisa- por exemplo adiciona uma string.

Agora, quando eu usar essa biblioteca da aplicação, meu singleton não parece conter qualquer vestígio da corda, que deveria ser adicionado.

Eu definitivamente estou faltando alguma coisa, mas eu não sei o que ..

Foi útil?

Solução

Se você tem um objeto em uma biblioteca estática que não é EXPLICITAMENTE usado na aplicação. Em seguida, o vinculador não vai puxar o objeto da lib para o aplicativo.

Há uma grande diferença entre as bibliotecas estáticas e dinâmicas.

Biblioteca Dinâmica:
Em tempo de compilação nada é retirado da biblioteca dinâmica. código extra é adicionado para carregar explicitamente e resolver os símbolos em tempo de execução. Em tempo de execução de toda a biblioteca é carregada e, assim, inicializadores de objeto são chamados (embora quando é detalhe de implementação).

Bibliotecas estáticas são tratados de forma muito diferente:
Quando você ligar com uma biblioteca estática que puxa todos os itens que não são definidas no aplicativo que são definidas na biblioteca na aplicação. Isto é repetido até que não haja mais dependências que a biblioteca pode resolver. O efeito colateral disso é que os objetos / funções não explicitamente utilizados não são puxados forma a biblioteca (variáveis ??assim globais que não são acessados ??diretamente não vai ser puxado).

Outras dicas

A minha memória disto é um pouco confuso, mas você pode estar sendo atingido com um problema de ordem de inicialização. Não há garantias de que initializers variáveis ??fim estáticos em diferentes arquivos são chamados, por isso, se o seu singleton não é inicializado ainda quando a sua variável estática na biblioteca está sendo inicializado, que pode produzir o efeito que você está vendo.

A forma como eu comecei em torno destes problemas é ter algum tipo de função init explícito que faz essas coisas e que eu chamo no início do main ou algo assim. Você pode ser capaz de mexer com a ordem em que você dá o arquivo objeto e argumentos da biblioteca para o compilador (ou vinculador, na verdade) porque isso também funcionou para mim, mas que a solução é um pouco frágil porque depende não só sobre a utilização do ligador específico, mas provavelmente também a versão específica.

Refactor as classes fazendo inicialização estática para que eles não dependem de quaisquer outras classes. Ou seja, tornar independente a inicialização de cada classe e auto-suficiente.

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