nixp.ru v3.0

27 декабря 2024,
пятница,
01:26:17 MSK

Gnus написал 14 октября 2005 года в 21:15 (979 просмотров) Ведет себя неопределенно; открыл 16 тем в форуме, оставил 26 комментариев на сайте.

Странное дело: при написании прог на С++ с использованием классов и libX11 они (проги) отказываются линковаться, при этом матерятся так:

/tmp/cco3fOno.o(.eh_frame+0×11): undefined reference t `__gxx_personality_v0\′

collect2: ld returned 1 exit status

Самое смешное то, что если писать на простом Си(без объектов) — всё нормально, равно как и на С++, но без Иксов.

Используются gcc 3.2 и binutils 2.12

Uncle Theodore

Приведи, пожалуйста, полный пример: код, компиляционную команду и ошибку.

У меня такого никогда не было, возможно ты не совсем правильно линкуешь (надо -lX11 тоже, например).

Good Luck,

UT

Gnus
Uncle Theodore
код, компиляционную команду и ошибку.

В самом простом случае это выглядит так:

#include

#include

class Win {

public:

int x,y;

void Open(void);

private:

Display *d;

};

void Win::Open(void)

{

d=XOpenDisplay(NULL);

if(d==NULL)

{

puts(«ошибка»);

return;

}

}

int main(int argv,char *argc[])

{

Win *w;

w->x=3;

w->y=2;

w->Open();

return 0;

}

Компилируем:

gcc -L /usr/X11R6/lib -lX11 tmp.cpp

Получаем:

/tmp/cczOfjUh.o(.eh_frame+0×11): undefined reference to `__gxx_personality_v0\′

collect2: ld returned 1 exit status

rgo

во-во! да! я вчерась буквально наткнулся на такую же ошибку. В программке гораздо проще — она была чуть навороченнее чем hello-world. Причём любопытно то, что если компилировать не так:

gcc file.cc

а так:

g++ file.cc

то всё работает.

Я вообще C++ не пользуюсь — просто хотел какое-то его свойство проверить. И тут такой бонус.

Есть у меня смутные подозрения, что когда я полгода назад развлекался с установкой и переустановкой gcc что-то я перемудрил. В конечном-то итоге я вернулся к версии кот. с дистром идёт (прямо с диска дистра и поставил, командой install-pkg), но видать что-то перемудрил. Плюс я не помню как я сносил результаты своих экспериментов.

Более того, могу сказать следующее, сейчас компилировал программку hello-world, очевидного содержания…

команда:

gcc hello-world.cc

приводит к ошибке. А команды

g++ hello-world.cc
gcc hello-world.cc -lstdc++

нет.

Gnus
rgo

g++ file.cc

Попробовал — скомпилилось. Уже обрадовался было, но выяснилось, что при вызове метода нарушается сегментация. Может исходник бажный?

decvar


int main(int argv,char *argc[])
{
Win *w = new Win(); <----------
w->x=3;
w->y=2;
w->Open();
return 0;
}

а лучше

int main(int argc, char ** argv[])
{
Win win;
win.x = 3;
win.y = 5;
win.Open();
return 0;
}

учите мат часть!

Gnus
decvar
а лучше

int main(int argc, char ** argv[])
{
Win win;
win.x = 3;
.....
}

Я кстати с самого начала так и делал, но при компиляции обычным способом (gcc а не g++) вылезали какие-то синтаксические ошибки, и пришлось поставить указатель. Может это из той же оперы, что и ошибка линковщика?

decvar

gcc и g++ это разные вещи. Указатель, и указатель на созданный класс это разные вещи. Перед тем, как использовать не самый простой framework Xlib, необходимо хоть что-нибудь прочитать по C++.

Еще разок, для догоняющих : «учите мат часть!»

Melnix

Гениально просто, почему был segmentation fault.

decvar пишет, что в коде:

Win *w = new Win(); <———-

надо заменить на это:

Win win;

а Gnus в своём исходнике:

Win *w;

тем самым создавая указатель, но не выделяя памяти оператором new!

Последние комментарии

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.