2010-09-17 18 views
16

Ich versuche, eine einfache Komponententestdatei mit cpputest zu erstellen. Ich habe das cpputest-Framework in eine statische Bibliothek eingebaut und versuche nun, dieses in eine ausführbare Datei zu integrieren. Allerdings bin ich wegen des zugehörigen Codes in ein ziemlich kompliziertes Makefile-Setup eingebunden.Undefinierter Verweis auf Operator neu

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 erhalte viele Fehler wie folgt aus:

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. Erhalte ich den Operator nicht kostenlos mit C++ neu?

+0

Es ist wirklich schwer zu helfen, basierend auf diesen Informationen. Versuchen Sie, die Bedingungen zu reduzieren, die notwendig sind, um das Problem zu reproduzieren. Die obige Befehlszeile ist viel zu komplex, auch wenn wir davon ausgehen, dass der Code einfach ist und keine Dinge wie "Operator neu" neu definiert. –

+0

Wird beim ersten Fehler ein neuer Operator gemeldet? Wenn nicht, was ist der erste Fehler? –

+0

Ja, die einzigen gemeldeten Fehler sind neue Bedienerfehler. Das gezeigte ist das erste. – mbyrne215

Antwort

6

Es gibt sehr wenig Informationen in der Frage zu arbeiten, aber es sieht aus wie ein Code, irgendeine Form von Platzierung neuer verwendet, und während dieser speziellen operator new ist erklärt (der Compiler findet es und kompiliert den Code Wenn er es verwendet), kann der Linker seine Definition nicht finden.

+0

Ich bin nicht sicher, welche anderen Informationen hinzuzufügen. Der Code ist wirklich einfach; Es definiert nicht neu, also kann ich nicht verstehen, warum der Linker es nicht aus der Standardbibliothek finden kann. – mbyrne215

+1

@ mbyrne215: Sie könnten den einfachsten Code hinzufügen, der dies reproduziert. Die Fehlermeldung erwähnt deutlich einen 'Operator new (unsigned int, char const *, int)' (aufgerufen von 'CommandLineTestRunner :: parseArguments (TestPlugin *)'), was eindeutig nicht die Standardversion dieses Operators ist. – sbi

+2

Sie haben Recht; Ich war so aufgelegt, dass ich nach den Gründen suchte, warum die Standard-Bibliotheken nicht funktionierten. Ich habe die Bibliothek der dritten Partei nicht genau durchgesehen. Es wurde heimlich neu definiert. Ich habe diesen Teil entfernt und alles ist gut. Vielen Dank. – mbyrne215

46

Sie müssen wahrscheinlich mit der C++ - Support-Laufzeitbibliothek verlinken. Dies geschieht automatisch beim Aufruf von g ++. Unter Linux wird dies erreicht, indem dem Linker das Flag -lstdC++ hinzugefügt wird. Sie müssen herausfinden, wie Sie das Gleiche auf Ihrer Plattform tun können.

+0

+1, danke .. – Oli

+0

das war die Antwort, die das Problem gelöst hatte Ich hatte – yota

4

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 habe. Dies stört wahrscheinlich den Verknüpfungsschritt, da es jetzt zwei Arten von Objektdateien gibt, native (für modifizierte Quelldateien) und nicht-native (alle anderen). Ich vermute hier, aber der Operator "neu" bedeutet etwas anderes auf verschiedenen Architekturen und deshalb erhalten Sie diesen Fehler.

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

+0

in meinem Fall gab es einige .o-Dateien, von meinem Vorgänger, links nach einem make clean alles funktionierte wie ein Charme – aldr

0

Vielleicht rufen Sie gcc, der C-Compiler anstelle von g++, die der C++ - Compiler ist.

0

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

Verwandte Themen