gcc compiler du code C++: undefined reference to `opérateur new[](unsigned long long)'
Il y a un code C++:
#include <stdio.h>
int main() {
int b = sizeof('a');
if(b==4) printf("I'm a C program!\n");
else printf("I'm a C++ program!\n");
}
Le compiler comme ceci:
gcc main.cpp -o main
Il réussit et donne:
I'm a C++ program!
Puis ajouter une ligne quelque part à l'intérieur de la fonction main
int *p1 = new int [1000];
Il échoue avec:
C:\Users\...\AppData\Local\Temp\cccJZ8kN.o:main1.cpp:(.text+0x1f): undefined reference to operator new[](unsigned long long)'
collect2.exe: error: ld returned 1 exit status
Puis les deux commandes suivantes réussi à compiler le code:
gcc main.cpp -o main -lstdc++
et
g++ main.cpp -o main
Le compilateur minGW-win64 (http://mingw-w64.sourceforge.net/).
Les questions sont:
- Lequel des deux dernières commandes sont mieux?
- À mon esprit
gcc
correctement choisit le droit compilateur, mais utilise ensuite un mauvais éditeur de liens. Est-il juste? - Qu'il peut être un problème dans minGW-win64?
Que je vois (corrigez-moi si c'est faux) gcc
a été conçu pour être un programme qui prend en entrée et décide quoi faire avec elle. Donc je ferais mieux d'utiliser gcc
si cela a fonctionné sans -lstdc++
. Mais si il n'est pas possible je vais vous préférez l'utilisation de g++
plutôt que de ne-sais-quoi gcc
peut manquer.
Merci beaucoup pour vos considérations
gcc
C,g++
est pour le C++.gcc -lstdc++
pourraient travailler pour le C++, mais vous devriez vraiment juste utiliserg++
pour le C++.- En aparté, un programme C++ a
sizeof 'A' == 1
, tout un programme C asizeof 'A' == sizeof(int)
. Dans certaines implémentations, les deux sont vrais en même temps de toute façon. - Voir aussi stackoverflow.com/questions/172587/...
- Merci pour vos réponses les gars! Comme je vois, il doit être le comportement attendu de minGW-win64. Va choisir
g++
pour l'instant.
Vous devez vous connecter pour publier un commentaire.
gcc
est le compilateur GCC-pilote pour les programmes en C,g++
est un pour les programmes C++.Les deux vont deviner la langue sur la base de l'extension de fichier, à moins remplacées.
Mais si vous utilisez le mauvais pilote, la valeur par défaut-options-être tort, comme de laisser sortir du C++ standard library pour les programmes C++ compilé avec
gcc
lors de la liaison.Vous peut d'ajouter la bibliothèque avec
-lstdc++
, mais en utilisant le pilote approprié est préférable, comme la plaine de gcc peut-être manquant, d'autres, plus subtiles options.