webentwicklung-frage-antwort-db.com.de

Undefinierter Verweis auf Operator new

Ich versuche, eine einfache ausführbare Datei des Komponententests zu erstellen, die cpputest verwendet. Ich habe das cpputest-Framework in eine statische Bibliothek eingebaut und versuche jetzt, dies in eine ausführbare Datei zu verknüpfen. Ich bin jedoch wegen des damit verbundenen Codes an ein ziemlich kompliziertes Makefile-Setup gebunden.

Dies ist meine Befehlszeile:

/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 

Ich bekomme viele Fehler wie die folgenden:

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

Ich kann nicht herausfinden, was das verursacht. Bekomme ich mit C++ keinen neuen Operator?

20
mbyrne215

Es gibt sehr wenige Informationen in Ihrer Frage, aus denen Sie arbeiten müssen, aber es sieht so aus, als würde ein Code eine Form von Platzierung neu verwenden, und während dieser spezielle operator newdeklariertist ( Der Compiler findet es und kompiliert den Code unter Verwendung von). Der Linker kann seinDefinitionnicht finden.

(Da diese alte Antwort meiner Meinung nach immer noch Beachtung findet: Siehe hier für eine ausführliche Diskussion über Deklaration vs. Definition.)

7
sbi

Sie müssen wahrscheinlich eine Verknüpfung mit der Laufzeitbibliothek der C++ - Unterstützung herstellen. Dies geschieht automatisch, wenn Sie g ++ aufrufen. Unter Linux wird dies durch Hinzufügen des Flags -lstdc ++ zum Linker erreicht. Sie müssen herausfinden, wie Sie das Gleiche auf Ihrer Plattform tun.

59
zvrba

Sie müssen Ihren Code von Grund auf neu erstellen, einschließlich der Bibliothek. Ich habe diesen Fehler erhalten, weil ich versehentlich Objektdateien, die auf einem anderen Computer (mit dem Rest der Quelle) kompiliert wurden, auf meinen Computer kopiert hatte. Wahrscheinlich stört dies den Verknüpfungsschritt, da es jetzt zwei Arten von Objektdateien gibt, native (für geänderte Quelldateien) und nicht native (alle anderen). Ich vermute hier, aber der Operator 'new' bedeutet etwas unterschiedliche Dinge auf verschiedenen Architekturen und deshalb erhalten Sie diesen Fehler.

p.s. Ich weiß, dass dies für eine nützliche Antwort viel zu spät ist, aber ich poste dies immer noch für die Aufzeichnung. 

4
BavidDowman

Vielleicht rufen Sie gcc auf, den C-Compiler anstelle von g++, der den C++ - Compiler darstellt.

2
Shakaron

Für QNX 6.5.0 habe ich das Flag -lang-c++ für qcc (gcc) angegeben, um den Fehler zu vermeiden.

0
Maxim Suslov