Pergunta

Estou criando um programa C ++, mas quero poder oferecer apenas um arquivo .exe ao usuário. No entanto, estou usando bibliotecas (Curl entre outras) que têm algumas DLLs. É possível compilar essas DLLs no arquivo .exe?

Eu uso o código :: blocos e mingw.

Foi útil?

Solução

Para conseguir isso, você precisará Vinculação estática. Isso exige que todas as suas bibliotecas (e as bibliotecas das quais dependem recursivamente) precisem estar disponíveis como bibliotecas estáticas. Esteja ciente de que o tamanho do seu executável será grande, pois levará todo o código dessas bibliotecas estáticas. É por isso que as bibliotecas compartilhadas (DLLs) foram inventadas em primeiro lugar, para poder compartilhar código comum entre os aplicativos. No entanto, isso nem sempre funciona tão bem no Windows.

Eu acho que o que você realmente quer é um instalador que instala o seu executável e tudo o que suas bibliotecas dependentes.

Outras dicas

Há um artigo no DDJ de 2002 que pode ter o que você deseja:

Basicamente, ele usa uma combinação de vinculação à DLL usando o recurso 'atraso de carga' do MSVC e empacotar a DLL como um recurso incorporado no exe. A DLL é então extraída automaticamente em tempo de execução quando a primeira chamada para uma das exportações for feita.

Eu não usei essa técnica, então não posso realmente comentar sobre como funciona bem, mas com certeza parece uma ideia lisa.

Você pode usar Ilmerge

Eu me deparei dll2lib utilidade uma vez. Peça interessante, apesar de caro. Ele permite que você converta praticamente qualquer DLL em uma biblioteca estática, que pode estar posteriormente vinculada ao seu aplicativo para produzir um exe sólido. A versão gratuita do IIRC mostrará certa notificação (MessageBox) ao inserir uma função dessa biblioteca gerada.

Você precisa de algumas ferramentas especiais de empacotador como Xbundler.

Se você realmente precisar conseguir isso, pode usar esta biblioteca incrível que permitirá carregar uma DLL da memória. Eu o usei para ler uma DLL de um recurso e carregá -lo para mim.

https://github.com/fancycode/memorymodule

Em geral, não. As DLLs têm algum comportamento especial que não é trivial, como a aquisição de trava do carregador quando são carregados e chamando a Dllmain nesses pontos. Embora um ligante teórico pudesse providenciar para que cada DLLMain fosse chamado do aplicativo principal (), isso não aconteceria sob bloqueio carregado. Esta trava do carregador está sob controle do sistema operacional. Além disso, as DLLs são notificadas de novos tópicos por meio de sua dllmain, e isso também seria quase impossível de fingir.

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