2010-09-17 22 views
16

Sto provando a creare un semplice eseguibile del test dell'unità, utilizzando cpputest. Ho creato il framework cpputest in una libreria statica e sto cercando di collegarlo a un eseguibile. Tuttavia, sono legato a una configurazione Makefile abbastanza complicata, a causa del relativo codice.Riferimento non definito all'operatore new

Questa è la mia linea di comando:

/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 

Ricevo molti errori come il seguente:

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

non riesco a capire che cosa sta causando questo. Non ottengo l'operatore nuovo gratuitamente con C++?

+0

È davvero difficile aiutare in base a queste informazioni. Prova a * ridurre * le condizioni necessarie per riprodurre il problema. La riga di comando di cui sopra è troppo complessa, anche se assumiamo che il codice sia semplice e non faccia cose come ridefinire 'operator new'. –

+0

Il primo errore ha segnalato un nuovo errore dell'operatore? In caso contrario, qual è il primo errore segnalato? –

+0

Sì, gli unici errori riportati sono nuovi errori dell'operatore. Quello mostrato è il primo. – mbyrne215

risposta

6

C'è molto poco informazioni nella sua domanda di lavorare da, ma sembra un po 'di codice utilizza una qualche forma di nuova collocazione, e mentre quella speciale operator new è dichiarato (il compilatore lo trova e compila il codice utilizzandolo), il linker non riesce a trovare la sua definizione.

+0

Non sono sicuro di quali altre informazioni aggiungere. Il codice è davvero semplice; non ridefinisce 'nuovo', quindi non riesco a capire perché il linker non riesce a trovarlo dalla libreria standard. – mbyrne215

+1

@ mbyrne215: è possibile aggiungere il codice più semplice che riproduce questo. Il messaggio di errore menziona chiaramente un 'operatore new (unsigned int, char const *, int)' (chiamato da 'CommandLineTestRunner :: parseArguments (TestPlugin *)'), che chiaramente non è la versione standard di quell'operatore. – sbi

+2

Hai ragione; Mi sono così appeso alla ricerca del motivo per cui le librerie standard non funzionavano, non ho guardato da vicino la libreria di terze parti. Stava ridefinendo segretamente il nuovo. Ho rimosso quella parte e tutto va bene. Grazie. – mbyrne215

46

Probabilmente è necessario collegare la libreria di runtime del supporto C++. Questo succede automaticamente quando invochi g ++. Su Linux, questo si ottiene aggiungendo flag -lstdC++ al linker. Devi capire come fare lo stesso sulla tua piattaforma.

+0

+1, grazie .. – Oli

+0

questa è stata la risposta che ha risolto il problema che avevo – yota

4

È necessario ricostruire il codice da zero, inclusa la libreria. Ho ricevuto questo errore perché ho copiato inavvertitamente file oggetto compilati su un'altra macchina (con il resto della sorgente) sulla mia macchina. Molto probabilmente questo disturba il passaggio di collegamento poiché ora ci sono due tipi di file oggetto, nativo (per i file di origine modificati) e non nativo (tutti gli altri). Sto indovinando qui, ma l'operatore 'nuovo' significa cose leggermente diverse su architetture diverse ed è per questo che stai ricevendo questo errore.

p.s. So che è troppo tardi per una risposta utile, ma sto ancora postando questo per il record.

+0

nel mio caso c'erano alcuni file .o, dal mio predecessore, rimasti dopo un make clean tutto funzionava come un incantesimo – aldr

0

Forse stai chiamando gcc, il compilatore C invece di g++, che è il compilatore C++.

0

Per QNX 6.5.0 ho specificato la flag -lang-c++ per qcc (gcc) per evitare l'errore.

Problemi correlati