Domande sul collegamento di librerie in C

7

Sto imparando C (ancora molto principiante) su Linux usando il compilatore GCC. Ho notato che alcune librerie, come la libreria utilizzata con l'intestazione math.h , devono essere collegate manualmente quando incluse. Sono stato collegato alle librerie utilizzando vari flag della forma -l[library-name] , ad esempio -lm per la libreria matematica sopra menzionata.

Tuttavia, dopo aver passato dalla riga di comando e / o% da% di% a% di% di co_de, ho notato che Geany usa Code::Blocks per compilare i programmi invece di Code::Blocks a cui sono abituato (anche se il progetto è sicuramente specificato come C). Inoltre, g++ non richiede che le librerie vengano collegate manualmente durante la compilazione - librerie come la libreria matematica funzionano .

Ho due domande:

In primo luogo, è "cattivo" compilare programmi C con il compilatore gcc ? Finora sembra funzionare, ma dopo tutto, C ++ non è C e sono abbastanza sicuro che il compilatore Code::Blocks è pensato per C ++.

In secondo luogo, è il compilatore g++ che sta eseguendo il collegamento automatico delle librerie in g++ ?

    
posta james 09.10.2012 - 11:01
fonte

2 risposte

5

Sia gcc che g ++ sono front-end della raccolta del compilatore GNU. Dovresti usare il primo per compilare e collegare il codice C, e il secondo per eseguire le stesse azioni sul codice C ++. Uno degli argomenti più importanti per mantenere la distinzione è che C non è un sottoinsieme di C ++ .

Se si collega usando g ++, si collegherà automaticamente alla libreria standard C ++. Poiché la libreria standard C fa parte della libreria standard C ++, è inclusa anche la libreria matematica. Questo è il motivo per cui non è necessario collegare manualmente la libreria matematica.

    
risposta data 09.10.2012 - 11:25
fonte
2

Firstly, is it "bad" to compile C programs with the g++ compiler?

Definisci "cattivo".

Ci sono alcune cose che possono causare la compilazione di un programma C valido in C ++ con una semantica diversa, se la mia esperienza è pertinente, hai più possibilità di trovare UB gestito diversamente quando cambi la versione del tuo compilatore C piuttosto che incontrarlo loro.

Un compilatore C ++ non compilerà alcuni programmi C validi, quindi compilare C con un compilatore C ++ ti limiterà al loro sottoinsieme comune, che è una versione più rigida di C. Limitare te stesso a quel dialetto C non è non idiomatico (il maggiore la differenza è la necessità di eseguire void * quando è necessario un altro tipo di puntatore), ma alcuni progetti hanno iniziato a utilizzare C ++ in questo modo. Loro utilizzavano un compilatore C ++ per ottenere una versione di C più sicura del tipo e quindi decidevano di consentire l'uso delle funzionalità aggiuntive, una per una, poiché le ritenevano pertinenti. (L'ultimo esempio più pubblico è gcc stesso. GCC ha iniziato a essere scritto in K & RC, quindi ha richiesto un compilatore C ANSI, quindi era limitato al sottoinsieme comune di ANSI C e C ++ e ora stanno iniziando a utilizzare C ++, un altro esempio abbastanza pubblico è che gli esempi della seconda edizione di K & RC sono stati compilati con un compilatore C ++, ma penso che il C ++ sia stato rafforzato poiché mi sembra che alcuni esempi non vengano compilati con un compilatore C ++ corrente).

Si noti che se si usano solo compilatori C ++, si introdurranno rapidamente delle dipendenze in C ++.

Nota anche che le novità in C99 e C11 sono più soggette a essere diverse in C ++.

Secondly, is it the g++ compiler that is doing the automatic linking of the libraries in Code::Blocks?

Se usato per collegare, un compilatore collega sempre un set predefinito di librerie. Quel set per gcc non include libm, è incluso nel set predefinito per g ++. G ++ non rileverà automaticamente le librerie aggiuntive se sono necessarie (AFAIK neanche Code :: Blocks), libm è un caso molto particolare (alcuni sostengono che il fatto che gcc non lo colleghi per default è un bug in gcc).

    
risposta data 09.10.2012 - 13:52
fonte

Leggi altre domande sui tag