Estou aprendendo C (ainda muito iniciante) no Linux usando o compilador GCC. Percebi que algumas bibliotecas, como a biblioteca usada com o math.h
cabeçalho, precisam ser vinculadas manualmente quando incluídas. Estive vinculando nas bibliotecas usando vários sinalizadores do formulário -l[library-name]
, como -lm
na biblioteca matemática mencionada acima.
No entanto, depois de alternar da linha de comando e / ou Geany
para Code::Blocks
, notei que ele é Code::Blocks
usado g++
para compilar os programas em vez dos gcc
que eu estou acostumado (mesmo que o projeto seja definitivamente especificado como C). Além disso, Code::Blocks
não exige que as bibliotecas sejam vinculadas manualmente ao compilar - bibliotecas como a biblioteca de matemática apenas funcionam .
Eu tenho duas perguntas:
Em primeiro lugar, é "ruim" compilar programas C com o g++
compilador? Até o momento, parece funcionar, mas, afinal, C ++ não é C e tenho certeza de que o g++
compilador se destina a C ++.
Em segundo lugar, é o g++
compilador que está fazendo a ligação automática das bibliotecas Code::Blocks
?
Respostas:
O gcc e o g ++ são frontends da coleção do compilador GNU. Você deve usar o primeiro para compilar e vincular o código C, e o último para executar as mesmas ações no código C ++. Um dos argumentos mais fortes para manter a distinção é que C não é um subconjunto de C ++ .
Se você vincular usando o g ++, ele será vinculado automaticamente na biblioteca padrão do C ++. Como a biblioteca padrão C faz parte da biblioteca padrão C ++, a biblioteca matemática também é incluída. É por isso que você não precisa vincular manualmente a biblioteca de matemática.
fonte
Defina "ruim".
Existem algumas coisas que podem fazer com que um programa C válido seja compilado em C ++ com uma semântica diferente; se minha experiência for pertinente, você terá mais chances de encontrar o UB tratado de maneira diferente ao alterar a versão do seu compilador C do que encontrá-los.
Um compilador C ++ não compila alguns programas válidos em C; portanto, compilar C com um compilador C ++ o restringirá ao subconjunto comum, que é uma versão mais estrita do C. Restringir-se a esse dialeto C não é idiomático (a principal diferença é precisa lançar void * quando outro tipo de ponteiro é necessário), mas alguns projetos começaram a usar C ++ dessa maneira. Eles usaram um compilador C ++ para obter uma versão mais segura do tipo C e decidiram permitir o uso dos recursos adicionais, um por um, conforme os considerassem pertinentes. (O exemplo mais recente e mais público é o próprio gcc. O GCC começou a ser escrito em K&R C, depois mandatou um compilador ANSI C, ficou restrito ao subconjunto comum de ANSI C e C ++ e agora está começando a usar C ++, outro Um exemplo bastante público é que os exemplos da segunda edição da K &
Observe que, se você usar apenas compiladores C ++, introduzirá rapidamente dependências em C ++.
Observe também que as novidades em C99 e C11 estão mais sujeitas a serem diferentes em C ++.
Quando usado para vincular, um compilador sempre vincula um conjunto padrão de bibliotecas. Esse conjunto para o gcc não inclui o libm, ele está incluído no conjunto padrão para o g ++. O G ++ não detectará automaticamente bibliotecas adicionais se elas forem necessárias (o AFAIK nem o Code :: Blocks)
libm
é um caso muito particular (alguns argumentam que o fato de o gcc não vinculá-lo por padrão é um bug no gcc).fonte