Como evitar que o ligador de otimizar afastado código de inicialização?
-
18-09-2019 - |
Pergunta
Eu tenho o seguinte problema: Meu (C ++ -) projeto consiste em vários subprojetos. Em cada um, eu tenho vários arquivos com código que deseja executar na inicialização. Minha solução até agora é usar variáveis ??estáticas que exigem o respectivo código de inicialização da seguinte forma:
// Foo.cpp
static TFooRegistry sFooRegistry; // does stuff in constructor.
Ao construir meu projeto usando DLLs para cada subprojeto, tudo funciona funciona muito bem e com o Código como esperado. Ao vincular os subprojetos estaticamente, no entanto, o vinculador determina que foo.o contém nenhum código já referenciado a partir de fora e otimiza-lo afastado. Claro que eu poderia adicionar uma referência para sFooRegistry em outro lugar, mas isso é tedioso e propenso a erros.
O (conformant standard) formas de resolver este existem?
OK, o que posso fazer no mac / gcc e ganhar / visual studio?
Solução
Não há maneiras conformant padrão de forçar objetos em bibliotecas a serem inicializados - você tem que usar truques dependendo do seu especial plataforma (s). A diferença entre uma DLL e e uma biblioteca estática (no Windows, pelo menos) é que o primeiro tem start-up e código que é executado pelo sistema operacional shut-down, enquanto o segundo é apenas uma concatenação de arquivos objeto.
Além disso, o vinculador não é otimizar afastado o seu código de arranque - ele simplesmente não está ligando-lo, porque, aparentemente, nunca é utilizado. linkers são bestas muito estúpido - se você quiser descobrir como eles fazem o que fazem, dê uma olhada para o livro Linkers & Carregadeira .
Outras dicas
Alguns truque, mas revê-lo. Para o sistema Win (mas não linux) usar dllexport explícita -. Neste doen't caso vinculador sabe se este símbolo usado pelo aplicativo externo ou não