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)'
Я не могу понять, что вызывает это. Не могу ли я бесплатно получить оператор с С++?
Ответы
Ответ 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
), чтобы избежать ошибки.