Perguntas sobre como vincular bibliotecas em C


8

Estou aprendendo C (ainda muito iniciante) no Linux usando o compilador GCC. Percebi que algumas bibliotecas, como a biblioteca usada com o math.hcabeçalho, precisam ser vinculadas manualmente quando incluídas. Estive vinculando nas bibliotecas usando vários sinalizadores do formulário -l[library-name], como -lmna biblioteca matemática mencionada acima.

No entanto, depois de alternar da linha de comando e / ou Geanypara Code::Blocks, notei que ele é Code::Blocksusado g++para compilar os programas em vez dos gccque eu estou acostumado (mesmo que o projeto seja definitivamente especificado como C). Além disso, Code::Blocksnã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?


1
Eu acho que o Code: Blocks define algumas variáveis ​​de ambiente para procurar caminhos para a biblioteca em seu ambiente de construção ou adiciona essas informações quando chama o compilador. Você pode obter resultados semelhantes na linha de comando. Provavelmente, existem algumas opções de configuração no Code: Blocks, nas quais você pode definir esses detalhes sobre o seu ambiente de construção. Se você colocar informações semelhantes em .bashrc (ou em outros scripts ini), obterá os mesmos resultados. Talvez defina Code: Blocks para compilar a saída como detalhada (se isso for possível) para ver o que exatamente ele faz.
Thorsten Müller

Suponho que esta ligação vai lhe dar alguma ajuda por isso que ao compilar com g ++ não precisamos manualmente matemática Link Library: stackoverflow.com/questions/1033898/...

Respostas:


6

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.


3

Em primeiro lugar, é "ruim" compilar programas em C com o compilador g ++?

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 ++.

Em segundo lugar, é o compilador g ++ que está vinculando automaticamente as bibliotecas no Code :: Blocks?

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).


+1 em "alguns argumentam que o fato de o gcc não o vincular por padrão é um bug no gcc". Encontrei o mesmo problema, com a mesma biblioteca, e vim aqui para perguntar qual era a diferença entre os dois compiladores.
Lister
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.