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?

Foi útil?

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

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