Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > ошибка __cxa_vec_ctor


Автор: kuvshinka 10.12.2009, 22:39
подскажите пож-та - программа выдает 2 ошибки типа "undefined reference to __cxa_vec_ctor" -первый раз на строке с "}" от описания некой функции, второй - на строке объявления функции в классе....что же такое __cxa_vec_ctor и как исправить сию ошибку? в программе нет ничего подобного...  

Автор: MAKCim 10.12.2009, 23:47
если код небольшой, покажите

Автор: xvr 11.12.2009, 12:19
Цитата(kuvshinka @ 10.12.2009,  22:39)
подскажите пож-та - программа выдает 2 ошибки типа "undefined reference to __cxa_vec_ctor" 
как исправить сию ошибку? 

Линковать с помощью g++
Цитата

в программе нет ничего подобного...
Это функция run-time поддержки С++. Видимо в программе есть массив объектов с конструктором. Судя по названию, __cxa_vec_ctor это вспомогательная функция для вызова конструкторов для массива объектов

Автор: kuvshinka 12.12.2009, 21:44
xvr: вы совершенно правы - этот конфликт возникает при использовании массива объектов и конструктора....но почему такая ошибка появляется? их что же - нельзя использовать вместе?

Автор: xvr 12.12.2009, 21:56
Цитата(kuvshinka @ 12.12.2009,  21:44)
xvr: вы совершенно правы - этот конфликт возникает при использовании массива объектов и конструктора....но почему такая ошибка появляется? 

Это не ошибка. Это неправильная сборка программы

Цитата

их что же - нельзя использовать вместе?
Можно. Но нужно линковать с библиотекой поддержки С++.
Если вы линкуете программу с помощью g++, то он добавляет эту библиотеку сам. Если же вы линкуете с помощью ld, то эту библиотеку надо подавать руками (что нибудь типа -lsupc++ или -lstdc++)

Автор: kuvshinka 15.12.2009, 20:51
так что же получается - нельзя использовать вместе массив объектов и конструктор данного класса? (если можно, то как избежать вышеуказанной ошибки компоновщика....проект собирается make-файлом...)

Автор: xvr 15.12.2009, 22:06
Цитата(kuvshinka @ 15.12.2009,  20:51)
так что же получается - нельзя использовать вместе массив объектов и конструктор данного класса?

Можно

Цитата

если можно, то как избежать вышеуказанной ошибки компоновщика....
Блин, в третий раз пишу - ЛИНКОВАТЬ С ПОМОЩЬЮ g++ !!!
Цитата

проект собирается make-файлом...
makefile на бочку, неа эээ Исходники в студию, ну в общем показывай как собираешь  smile 

Автор: kuvshinka 16.12.2009, 21:44
Код

program_name := Proga1
source_dirs  :=   ../my_files
include_dirs := $(source_dirs) # /usr/include/c++/4.2.1

CC=/opt/lcc/bin/lccs_il

CFLAGS:= -DOSTYPE=linux-gnu $(addprefix -I, $(include_dirs)) -w -D_POSIX_CPP -DGNU_LINUX -D_DYNAMIC_READING -D_GNU_SOURCE -g
LDFLAGS   := $(addprefix -L, $(lib_dirs)) -lfiles_rt -lel_pthread
 
headers := $(wildcard $(addsuffix *.h, $(source_dirs) ) )
source_files := $(wildcard $(addsuffix *.cpp, $(source_dirs) ) )
object_files := $(notdir $(source_files:.cpp=.o) )

$(program_name): $(object_files)
    @echo Linking ...
    $(CC) $^  $(LDFLAGS) -o Proga1
VPATH := $(source_dirs)

#include dependence

%.o: %.cpp $(headers)
    $(CC)  -c $(CFLAGS) $<

dependence: $(source_files) $(wildcard $(addsuffix *.h, $(include_dirs) ) )
    @echo Creating dependence ...
    $(CC) -M $(CFLAGS) $(source_files) > $@


Если использовать CC=/opt/e90/lcc/bin/lccs_il, то ошибок вообще не будет и создастся экзешник (если не используется массив объектов+конструктор)...при использовании CC=g++  на используемых в одном из cpp-ков переменых выдаются ошибки типа „переменная per1  was not declared in this scope“ (хотя они подключаются хидером) + ошибка ‘::main’ must return ‘int’... так что же и как надо подправить в таком make-файле, чтобы создавался экзешник даже при исп-ии массива объектов+конструктора?

Автор: xvr 16.12.2009, 22:13
Не знаю, что надо подправить в этом makefile'е, т.к. не имею ни малейшего представления, что это за компилятор - lccs_il. Могу только догадываться, что это не gcc  smile 

Цитата

при использовании CC=g++  на используемых в одном из cpp-ков переменых выдаются ошибки типа „переменная per1  was not declared in this scope“ (хотя они подключаются хидером)
Видимо как то не так подключаются

Цитата

ошибка ‘::main’ must return ‘int’...
Ну так напиши int main, делов то

Рекомендую поправить ошибки и перейти на g++  smile 

Автор: kuvshinka 16.12.2009, 22:28
хм...просто непонятно - указанный выше пример ошибок никаких не выдает - пробуешь то же самое но с g++ - эти ошибки возникают.....
тогда подскажите простенький вариант make-файла по сборке многофайлового проекта (много cpp-к) с использованием компилятора g++... 

Автор: xvr 17.12.2009, 11:39
Цитата(kuvshinka @ 16.12.2009,  22:28)
тогда подскажите простенький вариант make-файла по сборке многофайлового проекта (много cpp-к) с использованием компилятора g++...

Поменять CC=... на CC=g++
Цитата

хм...просто непонятно - указанный выше пример ошибок никаких не выдает - пробуешь то же самое но с g++ - эти ошибки возникают.....
А можно код (с ошибками) и сами ошибки?

Автор: kuvshinka 17.12.2009, 22:29
ну написано же выше - при изменении CC=... на CC=g++ возникают ошибки "in file..cpp „func1 was not declared in this scope“" и т.п.....но эти якобы "необъявленные"функции подключены соответствующим хидером (при исп-ии компилятора как в примере - ошибок вообще нет).... 

Автор: xvr 17.12.2009, 22:43
Цитата(kuvshinka @ 17.12.2009,  22:29)
ну написано же выше - при изменении CC=... на CC=g++ возникают ошибки "in file..cpp „func1 was not declared in this scope“" и т.п.....

Товарищи ученые - у меня в подвале происходит непонятный стук! Прошу разобраться!
Файл, где эта ошибка появляется покажите. И текст ошибки (дословно, как компилятор выдал)
Цитата

но эти якобы "необъявленные"функции подключены соответствующим хидером (при исп-ии компилятора как в примере - ошибок вообще нет)....
Ваш 'компилятор как в примере' похоже сам одна большая ошибка  smile Я как то g++ больше доверяю  smile 
Скорее всего ошибка в подключении хидеров (например циклическое включение хидеров)

Кстати, если ваш 'компилятор как в примере' это lcc, то он С++ не поддерживает, а поддерживает какую то дикую помесь С и С++ (этакий гибрид ужа с ежом). Я бы не стал с этой колючей проволокой связываться  smile 
 

Автор: shigorin 12.1.2017, 12:58
Вдруг ещё кто наткнётся поиском по
Код
undefined reference to `__cxa_vec_ctor'


Ответ сотрудников МЦСТ: "Попробуйте добавить в линковку опцию -lcxa" (в моём случае хватило export LIBS=-lcxa перед запуском autoreconf и configure); также сообщили, что планируется привести поведение в этом аспекте к соответствию gcc, но несколько позже.

Ну и на будущее: им и стоило сразу писать, уяснив, что это разница между lcc и gcc :)

Автор: shigorin 1.3.2018, 23:44
Ещё замечание: lcc-1.23 переработали в сторону совпадения поведения с gcc; "либо, чтобы не зависеть от версии компилятора, линковать с помощью g++" (цитата опять же коллег из МЦСТ).

PS: на всякий -- портируем https://altlinux.org/ports/e2k, уже неплохо https://sdelanounas.ru/blog/shigorin/.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)