Pergunta

Não sei se é possível fazer isso, mas gostaria que o /NodefaultLib fosse aplicado a um projeto de biblioteca estática.

Eu tenho muitos projetos de aplicação (A.EXE, B.DLL, C.DLL) que usam uma biblioteca estática comum D.Lib. Esta biblioteca possui muito código e também possui outras dependências .lib também. Um deles é a biblioteca OpenSSL, que parece ter sido construída para o Win32 contra a versão de lançamento do CRT (não tenho o projeto/fontes originais).

Até agora, para evitar a mistura das versões de liberação /depuração do CRT, tenho que colocar a diretiva /nodefaultLib:msvcrt.lib Linker Directive em todos os projetos de folhas (A.exe, B.DLL). Isso funciona, mas acho que não é a maneira ideal de lidar com essa questão. Tentei colocar essa propriedade no projeto D.LIB, mas isso não tem efeito.

Existe uma maneira de forçar o MSVC ++ a ignorar a dependência msvcrt.lib da biblioteca de terceiros?

Foi útil?

Solução

Um .lib não possui configurações de vinculador porque você não vincula, você vincula para isto. Um .lib é apenas um arquivo de arquivos .OBJ, como um arquivo .zip não compactado - é por isso que você precisa colocar a configuração em todos os projetos que links para ele.

Se você estiver usando o VS2005+, poderá usar folhas de propriedades para que você precise colocar a configuração em um só lugar e depois usar essa folha de propriedades em todos os projetos.

No entanto, o OpenSSL é exatamente isso - de código aberto, portanto, você poderá obter a fonte da versão que está usando e criá -la novamente (e adicioná -la ao seu sistema de controle de versão, é claro). Eu pensei que o OpenSSL poderia ser construído como uma DLL ou LIB, o que resolveria seu problema, pois a DLL não interferiria na ligação do seu código.

Falhando nisso, você sempre tem a opção de cortar sua funcionalidade em uma DLL separada, para que você tenha apenas problemas com um projeto.

Outras dicas

Meu entendimento é que, se a biblioteca LIB está vinculada estaticamente a uma DLL, a DLL contém todo o código relevante da LIB. Portanto, esse acoplamento não pode ser removido. Isso se baseia apenas na minha compreensão da vinculação estatal, não em experimentos.

Para impedir que sua biblioteca de link estática distribuída, dependendo de uma biblioteca de tempo de execução do MSVC específica, você precisa definir esta opção compilador (no Visual Studio 2010, parece):

Propriedades de configuração -> C/C ++ -> Avançado -> omite o nome da biblioteca padrão = sim (/zi)

Agora, seus usuários podem se vincular à sua liberação estática de liberação da construção de depuração e não tentar vincular a biblioteca de tempo de execução incorreta, causando problemas, bem como avisos de ligantes.

Observe que pode causar erros de link se sua biblioteca realmente depende de uma biblioteca de tempo de execução específica ou de seu comportamento, e os componentes compatíveis não são fornecidos de outra maneira.

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