Devo usar libc ++ ou libstdc ++? [fechadas]

89

Estou desenvolvendo executáveis ​​de interface de linha de comando para osx e linux usando c / c ++. O projeto será vinculado ao opencv. Devo usar libc ++ ou libstdc ++?

Loozie
fonte
1
Não sei, mas você pode achar isso interessante: clang-developers.42468.n3.nabble.com/…
DarenW
2
Essa resposta pode ser útil.
Yantao Xie
2
se você vincular ao opencv, use libstdc ++. eis por que stackoverflow.com/questions/13037659/…
Loozie

Respostas:

87

Eu usaria a biblioteca nativa para cada sistema operacional, ou seja, libstdc ++ no GNU / Linux e libc ++ no Mac OS X.

libc ++ não é 100% completo no GNU / Linux, e não há nenhuma vantagem real em usá-lo quando o libstdc ++ é mais completo. Além disso, se você deseja vincular a quaisquer outras bibliotecas escritas em C ++, é quase certo que elas tenham sido construídas com libstdc ++, portanto, você também precisará vincular a ela para usá-las.

Mais informações aqui sobre a integridade da libc ++ em várias plataformas.

Jonathan Wakely
fonte
3
Você poderia elaborar / fornecer links sobre o status de integridade de libc ++ no Linux? Não entendo muito bem por que isso seria específico da plataforma, já que libc ++ é apenas um monte de cabeçalhos de biblioteca padrão. Ou você quer dizer que é necessário construir o Clang wrt para bibliotecas de tempo de execução LLVM que não são bem suportadas no Linux?
TemplateRex
1
@TemplateRex, não sei o status atual, você pode procurar em libcxx.llvm.org . Eu não sigo a libc ++, então você está perguntando à pessoa errada, mas está sugerindo que "um monte de cabeçalhos da Biblioteca Padrão" nunca terá nenhum código específico de plataforma?
Jonathan Wakely
Bem, uma vez que você pode instalar o Linux praticamente no mesmo hardware da Apple que está executando o Mac OS X, eu me pergunto de onde viria a dependência de plataforma nos cabeçalhos C ++? Talvez alguns wrappers em torno de intrínsecos de CPU embutidos ou IO e coisas de tratamento de exceções sejam dependentes do sistema, mas meu entendimento é que essas coisas são tratadas no tipo librcxxrt de camadas binárias. Os cabeçalhos da Biblioteca Padrão não deveriam ser mais ou menos plugáveis?
TemplateRex
4
Não estou falando de hardware. Novamente, eu não tenho ideia sobre libc ++, mas a maioria das bibliotecas padrão C ++ são implementadas sobre a biblioteca C do sistema operacional e, por exemplo, o mapeamento de std::ctype_base::maskvalores para <ctype.h>constantes é totalmente dependente da plataforma. (Os intrínsecos da CPU são fornecidos pelo compilador, o tratamento de exceções é feito por uma camada ABI de baixo nível, mas o IO normalmente é feito inteiramente nas bibliotecas C ++ e C, não em coisas de baixo nível).
Jonathan Wakely
1
@abergmeier, esse é um argumento falso, porque (quando usado com o GCC ou outros processos de compilação elegíveis) libstdc ++ não impõe nenhuma restrição ao código que o usa, seja vinculado dinamicamente ou estaticamente. Não é o LGPL. Por favor, não espalhe FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan Wakely
30

As principais distribuições do Linux não fornecem LLVM libc ++ porque:

  1. Ao contrário da Apple e do FreeBSD, a GPL + 3 não é um problema, portanto, não há necessidade de implementar outra pilha aqui.
  2. Os componentes do Linux foram desenvolvidos em torno do GNU libstd ++ por muito tempo. Alguns deles não se baseiam em mais nada.
  3. Embora libc ++ seja forte em novos recursos, tem alguns problemas com o código legado.

Se eventualmente libc ++ se tornar parte das distribuições, será como um componente opcional. vincular a ele provavelmente exigirá opções extras.

Como Jonathan disse, você deve usar qualquer ferramenta incluída por padrão. O Clang é seguro para uso no Linux, pois está configurado como um substituto do GCC, portanto, nesse aspecto, você não precisa se preocupar com 2 compiladores. Além disso, como seu objetivo é duas plataformas, você deve dar uma olhada no cmake.

Mario Vazquez
fonte
2
O Clang não é um substituto do GCC ... Apenas outro compilador.
Isaac Pascual
4
@IsaacPascual O que Mario quis dizer com clang oficialmente tem em seus objetivos de design ser um substituto para o compilador proeminente na plataforma em que você o executa (por exemplo, gcc quando executado no Linux). O mesmo vale para o afaik do compilador da Intel. É a sua maneira de obter uma adoção mais ampla.
Johan Boulé
-3

diz-se que a libc ++ tem mais mensagens de erro legíveis por humanos em erros de modelo.

DAG
fonte
19
Tem certeza de que não está confundindo alegações de melhores diagnósticos com clang do que gcc? O que nem sempre é verdade hoje em dia e é completamente separado da implementação da biblioteca padrão que está sendo usada. Se você tiver algum exemplo em que as mensagens são melhores do que boatos, relate os bugs em gcc.gnu.org/bugs
Jonathan Wakely