Aumentar o registo e as bibliotecas carregadas dinamicamente

Estamos a usar o Boost.Log v2 (1.70) em nossa aplicação que está disponível para Windows e Linux. Recentemente eu refactored um dll carregado dinamicamente para também usar o impulso.Log.

a dll exporta funções api C para aceder a hardware dedicado. É usado em vários ambientes de programação: C, C++, Python, Delphi e também Labview. (A maioria não usa impulso.Log).

Para O Windows, o dll é construído para usar apenas libarias estáticas e para usar um tempo de execução estático, fazendo a missão é muito mais fácil.

isto funciona como esperado: ambas as instâncias de impulso log parecem ser totalmente independentes uma da outra. O aplicativo faz login em seu arquivo PIA, o dll em outro.

no Linux, o 'plugin' é compilado para usar bibliotecas partilhadas de tempo de execução e de impulso partilhado. Nós fizemos isso intencionalmente para ser capaz de usar as distribuições Linux boost libraries.

O efeito é que depois de plugin carregar a aplicação não mais logs em seu lavatório. Estamos vendo logs do plugin Sim. Como a API dll não está ciente de que pode haver outros também usando impulso.Log (== a mesma instância), ele chama boost::log: core:: get()-> remove_ all_ isinks() no registro reconfigurações.

seria possível fazer uma rota semelhante (como no Windows) e tentar construir o plugin usando ligação estática e um tempo de execução estático?

Ou esta abordagem está condenada?

embora actualmente a funcionar, está a usar um tempo de execução estático + impulso de ligação estático.Registar uma configuração de compilação viável para Janelas?

Obrigado antecipadamente., Gunther

Author: Gunther, 2020-10-27

2 answers

Usando a biblioteca estática do impulso.Log in multiple modules (executable and/or shared libraries) is not supported and will not work as intended. Aumentar.Log mantém um número de singletons internamente, que é quebrado por ter múltiplas instâncias de impulso.Iniciar um processo.

 0
Author: Andrey Semashev, 2020-10-27 19:47:31
Obrigado Andrey Semashev e Ulrich Eckhardt. Agora entendo que a implementação da Biblioteca do Boost.O registo restringe a sua utilização.

Utilização inválida: uma ligação de aplicações aumenta o registo (como dll) e carrega dinamicamente outra api.dll(ligado estaticamente para aumentar o log estático com o tempo de execução estático) usando dlopen(Linux) ou LoadLibrary (Windows) é um comportamento indefinido. Pode funcionar, pode não funcionar.

Utilização válida: Se ambos os artefactos (app, api.dll) partilha o impulso.Log (por dll, tempo de execução compartilhado), eles têm que estar cientes disso, de modo que a configuração de registro de um artefacto não vai ser alterada ou apagada pelo outro. Ainda do ponto de vista técnico, este seria um caso de uso válido.

No futuro, não usaremos mais o impulso.regista a api.dll remover o comportamento indefinido neste caso.

@Ulrich Eckhard: a interface para a Api.o dll é só C. Isto é necessário porque a Api é usada em vários envrionments (C, C++, Python, Labview ...). É por isso que a api.dll vem com sua própria infra-estrutura de registro completo. Não há classes de inversão de dependência exposta não é uma solução viável neste caso.

Obrigado.

Gunther

 0
Author: Gunther, 2020-10-28 10:02:51