Por que o uso de bibliotecas C ++ é tão complicado?

14

Antes de tudo, quero observar que eu amo C ++ e sou uma dessas pessoas que acha que é mais fácil codificar em C ++ do que em Java. Exceto por uma pequena coisa: bibliotecas.

Em Java, você pode simplesmente adicionar um pouco de jar ao caminho da construção e pronto.

Em C ++, você geralmente precisa definir vários caminhos para os arquivos de cabeçalho e a própria biblioteca. Em alguns casos, você ainda precisa usar sinalizadores de compilação especiais. Eu usei principalmente o Visual Studio, Code Blocks e nenhum IDE. Todas as três opções não diferem muito quando se fala em usar bibliotecas externas.

Eu me pergunto por que não houve alternativa mais simples para isso? Como ter um arquivo .zip especial que tenha tudo o que você precisa em um só lugar, para que o IDE possa fazer todo o trabalho para você configurar os sinalizadores de compilação. Existe alguma barreira técnica para isso?

Pijusn
fonte

Respostas:

15

O C ++ foi projetado para melhorar a linguagem C, tornando uma linguagem mais fácil e automatizada, com suporte para programação orientada a objetos. Mas não fez nada para alterar ou melhorar a maneira como o C lida com bibliotecas externas e arquivos de cabeçalho. O C ++ não possui um sistema de módulos como as linguagens mais modernas - ainda usa o pré-processador C e o sistema de vinculação. Como um dos objetivos declarados do C ++ era a compatibilidade com o código C, isso não é realmente surpreendente. Qualquer sistema de módulo C ++ teria que trabalhar junto com o antigo sistema de cabeçalho-arquivo / vinculador C. O comitê de padrões do C ++ simplesmente não conseguiu projetar um sistema de módulos mais moderno. (Embora eles estejam trabalhando nisso, veja o comentário de Klaim abaixo.)

Charles Salvia
fonte
8
A última linha não está totalmente correta: o sistema de módulos está em funcionamento desde 2004 (primeiro documento), mas implicava tanto trabalho que nem sequer podia ser realmente previsto para o último padrão, pois haveria falta de implementação para apoiar a proposta. Essa implementação está no wortk (junto com outros rascunhos) para definir o próximo padrão C ++. Não é que isso não seja uma prioridade dos designers de C ++, é apenas um desses recursos que você não pode errar, precisa manter a retro-compatibilidade (com a maioria dos códigos C e C ++ 11) e é incrivelmente difícil de acertar. Então leva muito tempo.
Klaim
Impressionante. Obrigado, Klaim, pela informação. Definitivamente vai dar uma olhada. Isso é muito empolgante :) #
1100 Pijusn
A maioria dos idiomas fica de fora do negócio de padronizar vínculos, porque o mecanismo pode variar entre os sistemas operacionais. A natureza de execução em qualquer lugar do Java requer a obrigatoriedade de um determinado link e formato de biblioteca. Não há nada de errado nisso, mas isso gera uma sobrecarga que pode não ser desejável em todos os casos.
Blrfl
Sinceramente, estou com medo de ler que o comitê de padrões C ++ está trabalhando em um sistema de módulos para a própria linguagem . O C ++ já é uma linguagem enorme e complexa e tentar adicionar um recurso tão sensível a ele pode ser muito arriscado. Conforme observado por Karl Bielefeldt aqui abaixo, esse problema já encontrou uma boa solução no nível da plataforma (sistema de pacotes Linux) e provavelmente poderia ser tratado muito bem pela maioria dos IDEs com pouco esforço. Veja como a Biblioteca Qt e o Qt Creator lidam com esse problema, por exemplo.
precisa saber é o seguinte
1
@AlexBottoni, eu realmente duvido que eles venham com um sistema de módulo padronizado a qualquer momento deste século. Eles nem sequer incluíram conceitos no C ++ 11 porque não podiam concordar com a implementação precisa. Um sistema de módulos que funciona ao lado do sistema de cabeçalho / vinculador é ainda mais complicado, e provavelmente não o veremos por muito tempo.
Charles Salvia
2

Não é uma barreira técnica. No Linux, seu "arquivo zip especial" é um pacote library-dev que você instala com um gerenciador de pacotes, e configurar os sinalizadores de inclusão e vinculador é tão simples quanto adicionar algumas linhas ao seu configure.acque usa pkg-config para configurar as coisas.

O Pkg-config também está disponível para Windows, mas as barreiras culturais impediram sua ampla adoção. O Unix tem um forte histórico de habilitar a portabilidade distribuindo código-fonte, portanto eles incluem as ferramentas de desenvolvimento gratuitamente. O Windows tem um forte histórico de incentivar apenas a distribuição binária e cobrar dos desenvolvedores ferramentas. Quando você ganha dinheiro vendendo bibliotecas, não faz sentido tornar mais fácil para terceiros fornecê-las.

Karl Bielefeldt
fonte