2010-09-17 14 views
16

Próbuję zbudować prosty testowy plik testowy, używając cpputest. Zbudowałem framework cpputest w bibliotece statycznej, a teraz próbuję połączyć to z plikiem wykonywalnym. Jednak jestem związany z dość skomplikowaną konfiguracją Makefile, ze względu na powiązany kod.Nieokreślone odniesienie do operatora new

To moja linia poleceń:

/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 

Dostaję wiele błędów jak następuje:

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

nie mogę dowiedzieć się, co jest przyczyną tego. Czy nie otrzymuję nowego operatora za darmo w C++?

+0

Na podstawie tych informacji bardzo trudno jest uzyskać pomoc. Spróbuj * zmniejszyć * warunki konieczne do odtworzenia problemu. Powyższa linia poleceń jest zbyt skomplikowana, nawet jeśli założymy, że kod jest prosty i nie robi rzeczy takich jak przedefiniowanie 'operatora new'. –

+0

Czy pierwszy błąd zgłosił nowy błąd operatora? Jeśli nie, jaki jest pierwszy zgłoszony błąd? –

+0

Tak, zgłaszane są tylko błędy nowego operatora. Ten pokazany jest pierwszy. – mbyrne215

Odpowiedz

6

Jest bardzo mało informacji w swoim pytaniu do pracy, ale wygląda na to jakiś kod wykorzystuje pewną formę umieszczenie nowego, a podczas tego specjalnego operator new jest oświadczył (kompilator znajdzie je i kompiluje kod używając go), linker nie może znaleźć swojej definicji.

+0

Nie jestem pewien, jakie inne informacje dodać. Kod jest naprawdę prosty; nie na nowo definiuje "nowego", więc nie rozumiem, dlaczego linker nie może go znaleźć ze standardowej biblioteki. – mbyrne215

+1

@ mbyrne215: Możesz dodać najprostszy kod, który to powieli. Komunikat o błędzie wyraźnie wspomina o 'operatorze new (unsigned int, char const *, int)' (wywołanym z 'CommandLineTestRunner :: parseArguments (TestPlugin *)'), co najwyraźniej nie jest standardową wersją tego operatora. – sbi

+2

Masz rację; Tak się rozłączyłem, szukając powodów, dla których standardowe biblioteki nie działały, nie przeglądałem dokładnie biblioteki osób trzecich. Potajemnie przedefiniowano nowe. Usunąłem tę część i wszystko jest w porządku. Dzięki. – mbyrne215

46

Prawdopodobnie potrzebujesz połączyć się z biblioteką uruchomieniową obsługi języka C++. Dzieje się to automatycznie po wywołaniu g ++. W Linuksie osiąga się to przez dodanie do linkera flagi -lstdC++. Musisz dowiedzieć się, jak zrobić to samo na swojej platformie.

+0

+1, dziękuję .. – Oli

+0

to była odpowiedź, która rozwiązała problem, który miałem – yota

4

Musisz odbudować swój kod od podstaw, łącznie z biblioteką. Dostałem ten błąd, ponieważ nieumyślnie skopiowałem pliki obiektów skompilowane na innym komputerze (wraz z resztą źródła) do mojego komputera. Najprawdopodobniej zakłóci to etap łączenia, ponieważ istnieją teraz dwa typy plików obiektowych, natywny (dla zmodyfikowanych plików źródłowych) i inny niż macierzysty (wszystkie inne). Zgaduję tutaj, ale operator "nowy" oznacza nieco inne rzeczy na różnych architekturach i dlatego dostajesz ten błąd.

p.s. Wiem, że jest już za późno na użyteczną odpowiedź, ale wciąż publikuję to dla nagrania.

+0

w moim przypadku było kilka plików .o, od mojego poprzednika, zostawiłem po make clean wszystko działało jak czar – aldr

0

Być może dzwonisz pod numer gcc, kompilator języka C zamiast g++, który jest kompilatorem C++.

0

Dla QNX 6.5.0 podałem flagę -lang-c++ dla qcc (gcc), aby uniknąć błędu.

Powiązane problemy