Неопределенная ссылка на оператора new - PullRequest
20 голосов
/ 17 сентября 2010

Я пытаюсь создать простой исполняемый файл модульного теста, используя 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)'

Я не могу понять, что вызвало это.Разве я не получаю новый оператор бесплатно с C ++?

Ответы [ 5 ]

60 голосов
/ 17 сентября 2010

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

7 голосов
/ 17 сентября 2010

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

(Поскольку этот старый мой ответ, кажется, все еще привлекает внимание: см. здесь для подробного обсуждения между декларацией и определением.)

4 голосов
/ 12 июня 2012

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

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

2 голосов
/ 22 ноября 2017

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

0 голосов
/ 15 декабря 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...