Pergunta

dizer que tenho um C ++ estático lib, static.lib e eu quero chamar algumas funções de um C ++ lib compartilhada, dizem shared.lib. É possível?

Agora vamos supor que eu tenho uma outra lib compartilhada, dizem shared2.lib que liga ao static.lib mas não link para shared.lib. Faz o vinculador automaticamente ligação shared2.lib para shared.lib neste caso?

Estou usando o Microsoft Visual Studio 2003.

Foi útil?

Solução

Bibliotecas estáticas não estão ligados. Eles são apenas uma coleção de arquivos objeto (* .obj ou * .o) que são arquivados juntos em um arquivo de biblioteca (como uma espécie de alcatrão / arquivo zip) para torná-lo mais fácil para o vinculador para encontrar os símbolos de que necessita.

A lib estática pode chamar funções que não estão definidos (mas só são declarados em um arquivo de cabeçalho), uma vez que só é compilado. Então, quando você vincular um exe ou DLL que usa o estático lib terá de ligação com outra biblioteca que fornece o chamado do lib estática, mas não definidos na mesma.

Se você quiser o linker para ligar automaticamente outras bibliotecas sugestão de Stephen vai funcionar e é usado por bibliotecas muito respeitável como impulso e STLport. Para fazer isso colocar o pragma no arquivo de cabeçalho principal para a biblioteca estática. Você deve incluir a biblioteca estática e seus dependentes.

No entanto IMO esse recurso é realmente significou para escritores biblioteca, onde a biblioteca está no caminho da biblioteca do sistema para o vinculador irá encontrá-lo facilmente. Também no caso de aumento e STLport eles usam esse recurso para suportar múltiplas versões das mesmas bibliotecas com opções definidas com #defines onde diferentes opções exigem diferentes versões da biblioteca a ser vinculado. Isso significa que os usuários têm menos probabilidade de impulso configure uma maneira e de ligação com uma biblioteca configurado outro.

A minha preferência para o código do aplicativo é ligar explicitamente as peças necessárias.

Outras dicas

O vinculador não trará automaticamente nas outras bibliotecas, mas você pode usar comentário # pragma (lib, "static.lib") para simplificar o processo de ligar os arquivos adicionais, adicionando o pragma para seus arquivos de cabeçalho.

dizer que tenho uma estática C ++ lib, static.lib e quero chamar alguns funções de um C ++ compartilhada lib, digamos shared.lib. É possível?

Sim, por exemplo, quando você chamar funções do Windows de dentro do seu estático lib eles são normalmente de alguma biblioteca dinâmica que não deverá haver nenhuma diferença.

Agora vamos supor que eu tenho uma outra compartilhada lib, dizem shared2.lib que liga ao static.lib mas não conectar-se a shared.lib. Faz o vinculador ligar automaticamente shared2.lib para shared.lib neste caso?

Tendo dependências como este poderia causar problemas mais tarde, eu sugiro que você em vez carregar dinamicamente as bibliotecas usando LoadLibrary () , dessa forma você não precisa manter o controle de tais dependências durante a compilação / ligação.

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