web-dev-qa-db-fra.com

Référence non définie à l'opérateur new

J'essaie de créer un exécutable de test unitaire simple en utilisant cpputest. J'ai construit le framework cpputest dans une bibliothèque statique et j'essaye maintenant de le lier dans un exécutable. Cependant, je suis lié à une configuration de Makefile assez compliquée, à cause du code associé.

Ceci est ma ligne de commande:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 

Je reçois beaucoup d'erreurs comme celle-ci:

 Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)':
   Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)'

Je ne peux pas comprendre ce qui cause ça. Est-ce que je ne reçois pas d'opérateur new gratuitement avec C++?

20
mbyrne215

Votre question contient très peu d’informations, mais il semble que certains codes utilisent une forme de placement new, et que ce operator new spécial estdéclaré( le compilateur le trouve et compile le code en l’utilisant), l’éditeur de liens ne trouve pas sondéfinition.

(Étant donné que cette réponse me semble toujours attirer l'attention: voir ici pour une discussion approfondie sur la déclaration par rapport à la définition.)}

7
sbi

Vous aurez probablement besoin de vous connecter à la bibliothèque d'exécution supportée par C++. Cela se produit automatiquement lorsque vous appelez g ++. Sur linux, ceci est réalisé en ajoutant l'option -lstdc ++ à l'éditeur de liens. Vous devez savoir comment faire la même chose sur votre plate-forme.

59
zvrba

Vous devez reconstruire votre code à partir de zéro, y compris la bibliothèque. J'ai eu cette erreur parce que j'ai copié par inadvertance des fichiers d'objet compilés sur une autre machine (avec le reste de la source) sur ma machine. Cela perturbera probablement l’étape de la liaison car il existe maintenant deux types de fichiers objet, natif (pour les fichiers source modifiés) et non natif (tous les autres). Je devine ici, mais l'opérateur 'new' signifie des choses légèrement différentes sur différentes architectures et c'est pourquoi vous obtenez cette erreur.

p.s. Je sais que c'est beaucoup trop tard pour une réponse utile, mais je le publie toujours pour le compte rendu. 

4
BavidDowman

Peut-être appelez-vous gcc, le compilateur C au lieu de g++, qui est le compilateur C++.

2
Shakaron

Pour QNX 6.5.0, j'ai spécifié l'indicateur -lang-c++ pour qcc (gcc) afin d'éviter l'erreur.

0
Maxim Suslov