web-dev-qa-db-fra.com

Quelle est la différence entre gcc et g ++ / gcc-c ++?

Il me semble que gcc peut gérer à la fois les projets c et c ++, alors pourquoi g ++/gcc-c ++ est-il nécessaire?

Quelle est la différence entre g ++ et gcc-c ++?

30
gdb

gcc compilera les fichiers source C en tant que fichiers source C et C++ en C++ si le fichier a une extension appropriée; cependant, il ne sera pas automatiquement lié dans la bibliothèque C++.

g++ inclura automatiquement la bibliothèque C++; par défaut, il compilera également les fichiers avec des extensions qui indiquent qu'ils sont source C en C++, au lieu de C.

De http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html#Invoking-G_002b_002b :

Les fichiers source C++ utilisent classiquement l'un des suffixes .C, .cc, .cpp, .CPP, .c++, .cp, ou .cxx; Les fichiers d'en-tête C++ utilisent souvent .hh, .hpp, .H, ou (pour le code de modèle partagé) .tcc; et les fichiers C++ prétraités utilisent le suffixe .ii. GCC reconnaît les fichiers portant ces noms et les compile en tant que programmes C++ même si vous appelez le compilateur de la même manière que pour la compilation de programmes C (généralement avec le nom gcc).

Cependant, l'utilisation de gcc n'ajoute pas la bibliothèque C++. g ++ est un programme qui appelle GCC et traite .c, .h et .i fichiers en tant que fichiers source C++ au lieu de fichiers source C, sauf si -x est utilisé, et spécifie automatiquement la liaison avec la bibliothèque C++. Ce programme est également utile lors de la précompilation d'un fichier d'en-tête C avec un .h extension à utiliser dans les compilations C++.

Par exemple, pour compiler un programme C++ simple qui écrit dans le std::cout stream, je peux utiliser soit (MinGW sous Windows):

  • g ++ -o test.exe test.cpp
  • gcc -o test.exe test.cpp -lstdc ++

Mais si j'essaye:

  • gcc -o test.exe test.cpp

J'obtiens des références non définies au moment du lien.

Et pour l'autre différence, le programme C suivant:

#include <stdlib.h>
#include <stdio.h>

int main() 
{
    int* new;
    int* p = malloc(sizeof(int));

    *p = 42;
    new = p;

    printf("The answer: %d\n", *new);

    return 0;
}

se compile et s'exécute correctement en utilisant:

  • gcc -o test.exe test.c

Mais donne plusieurs erreurs lors de la compilation en utilisant:

  • g ++ -o test.exe test.c

Les erreurs:

test.c: In function 'int main()':
test.c:6:10: error: expected unqualified-id before 'new'
test.c:6:10: error: expected initializer before 'new'
test.c:7:32: error: invalid conversion from 'void*' to 'int*'
test.c:10:9: error: expected type-specifier before '=' token
test.c:10:11: error: lvalue required as left operand of assignment
test.c:12:36: error: expected type-specifier before ')' token
55
Michael Burr

Pour autant que je sache, g ++ utilise les bonnes options de l'éditeur de liens C++ tandis que gcc utilise les options de l'éditeur de liens C (vous pouvez donc obtenir des références non définies, etc.).

0
Mehrdad