Подтвердить что ты не робот

Undefined ссылка на новый оператор

Я пытаюсь создать простой исполняемый файл unit test, используя cpputest. Я создал платформу cpputest в статической библиотеке, и теперь я пытаюсь связать ее с исполняемым файлом. Однако, я привязан к довольно сложной настройке Makefile из-за связанного кода.

Это моя командная строка:

/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 

Я получаю много ошибок, таких как:

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

Я не могу понять, что вызывает это. Не могу ли я бесплатно получить оператор с С++?

4b9b3361

Ответ 1

В вашем вопросе очень мало информации, но похоже, что какой-то код использует какую-то форму размещения new, и хотя этот специальный operator new объявлен (компилятор находит его и компилирует код, использующий его), компоновщик не может найти свое определение .

Ответ 2

Вероятно, вам нужно связать с библиотекой времени поддержки С++. Это происходит автоматически при вызове g++. В linux это достигается добавлением флага -lstdС++ в компоновщик. Вы должны выяснить, как сделать то же самое на своей платформе.

Ответ 3

Вам нужно перестроить свой код с нуля, включая библиотеку. Я получил эту ошибку, потому что я непреднамеренно скопировал объектные файлы, скомпилированные на другой машине (вместе с остальной частью источника) на мою машину. Скорее всего, это мешает этапу связывания, так как теперь существуют два типа объектных файлов: native (для модифицированных исходных файлов) и non-native (все остальные). Я угадываю здесь, но оператор "новый" означает несколько разные вещи на разных архитектурах и почему вы получаете эту ошибку.

p.s. Я знаю, что это слишком поздно для полезного ответа, но я все еще размещаю это для записи.

Ответ 4

Возможно, вы вызываете gcc, компилятор C вместо g++, который является компилятором С++.

Ответ 5

Для QNX 6.5.0 я указал флаг -lang-c++ для qcc (gcc), чтобы избежать ошибки.