Неопределенный символ ___gxx_personality_v0 по ссылке

Я получил это неопределенное здание символа с помощью этой командной строки:

$ gcc test.cpp
Undefined symbols:
  "___gxx_personality_v0", referenced from:
  etc...

test.cpp прост и должен нормально собираться. В чем дело?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
53
0
30 992
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Использовать

g++ test.cpp

вместо этого, поскольку это код C++.


Или, если вы В самом деле хотите использовать gcc, добавьте -lstdc++ в командную строку, например:

gcc test.cpp -lstdc++

Запуск md5 против a.out, созданного в каждом сценарии, показывает, что это один и тот же результат.

Но да, g++, вероятно, сделает ваш мир проще.

Я думал, что gcc - это интерфейс, который распознает файлы cpp и передает их правильному компилятору.

paxdiablo 15.10.2008 06:41

@Pax Diablo: Да, он использует правильный компилятор, однако g ++ передает libstdC++ компоновщику, а gcc - нет. :-П

Chris Jester-Young 15.10.2008 06:43

Да, это проблема компоновщика, а не компиляции. Обычно я не создаю отдельные файлы из командной строки таким образом, поэтому я даже не подумал и просто набрал gcc, думая, что это сработает.

ryan_s 15.10.2008 06:49

Я сам совершил ту же ошибку, по крайней мере, дважды, что я могу вспомнить. :-)

Head Geek 15.10.2008 07:04

Это не обязательно усталость или немота. Я вижу, что многие люди отвечают на использование g ++ вместо gcc, но это плохой ответ. У людей, которые спрашивают и ищут, может не быть такого выбора. Я работаю с библиотеками, имеющими версии C и C++, и пишу программу на C. Связывание с некоторыми из этих библиотек заставило меня привязаться к stdC++, и мне даже пришлось указать с помощью -L, где его найти внутри / usr / lib / gcc.

dividebyzero 16.12.2011 07:58

Не могу больше согласиться с divyzero, комбинирование C++ и C не является чем-то необычным. Может, ты самый тупой.

SSH This 13.12.2012 21:43

Работает для компиляции PHP 5.3 + fpm с EXTRA_CFLAGS = -lstdc++ в Makefile

renedet 07.11.2017 21:49

Расширение .cpp заставляет gcc компилировать ваш файл как файл C++. (См. Документы GCC.)

Попробуйте скомпилировать тот же файл, но переименуйте его, чтобы он имел расширение .c:

mv test.cpp
gcc test.c

В качестве альтернативы вы можете явно указать язык, передав компилятору -x c:

gcc -x c -c test.cpp -o test.o

Если вы запустите nm test.o в этих версиях языка C, вы заметите, что ___gxx_personality_v0 не указан как символ. (И если вы выполните ту же команду для объектного файла, созданного с помощью gcc -c test.cpp -o test.o, символ ___gxx_personality_v0 будет присутствовать.)

На всякий случай, если у кого-то такая же проблема, как у меня: расширение файла должно быть .c, а не .C (gcc чувствителен к регистру).

Это потому, что файлы .C распознаются cpp. То же самое, например, в CMake.

daminetreg 23.05.2014 09:36

Была та же проблема, но другое решение:

Код C++ в статической библиотеке связывается и на него ссылается файл .m. Переименование файла .m в .mm устранило проблему.

Другие вопросы по теме