gcc сцука.

bleyman


template <class Element> class DynamicArray
{
private:
...
public:
DynamicArray(int initialSize)
{
...
}

...
}

После этого в нескольких местах

void AddChild(Node * node)
{
if (NULL == this->children)
{
this->children = new DynamicArray<Node*>(1);
}
this->children->Add(node);
node->HasParent = true;
}

И объявление локальной переменной

int main
{
DynamicArray<Node*> nodes(1);
...
}
И что вы таки себе думаете?
ignatich:~$ gcc Spogulis.cpp
/tmp/cc6GBlwD.o(.text+0x226): In function `main':
: undefined reference to `operator new(unsigned)'
/tmp/cc6GBlwD.o(.text+0x33b): In function `main':
: undefined reference to `operator new(unsigned)'
/tmp/cc6GBlwD.o(.gnu.linkonce.t._ZN4Node8AddChildEPS_+0x1c): In function `Node::AddChild(Node*)':
: undefined reference to `operator new(unsigned)'
/tmp/cc6GBlwD.o(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
Естественно, м$ компилятор всё компилит. Wtf?

SCIF32

try
g++

SCIF32

gcc по умолчанию компилирует как c (не с++ соответственно никакого new там быть не должно.

bleyman

*подбирает выпавшую челюсть* а gcc это что? Бтв, g++ закомпилило =)

SCIF32

Компилятор.
man gcc, там всяко лучше написао, чем я тут скажу.

bleyman

Ыыы.
Видите ли, в C нет объектов, объявления переменных допустимы только сразу после открывающей фигурной скобки етс.
У меня есть вопрос - что компилит gcc? Да, кстати, _компилятор_ не ругается, ругается линкер.

Irina22

если не ошибаюсь, то gcc компилит .c как с, .C .cc .cpp как с++
наверно он компилить-то компилит, но нет у него с++ библиотек, вот он и ругается

rosali

g++ = gcc -lstdc++
Ну, типа того...

SCIF32

а бинарники у них разные потому, что эта опция в g++ вкомпилена по умолчанию?

Dasha30

я всегда думал, что g++ = gcc -x c++
а вот кусок мана:

gcc assumes preprocessed (.i) files are C and assumes C
style linking.

g++ assumes preprocessed (.i) files are C++ and assumes
C++ style linking.
А поскольку оба этих бинарника являются страшными оболочками над еще большим количеством бинарников, то разбираться как там все в точности устроено, я для себя всегда считал делом бесперспективным.

amkharchenko

gcc -v поможет отцу русской демократии

Realist

Можешь привести короткий пример проги, которая не компилится?
У меня такое

template <class Element> class DynamicArray
{
public:
DynamicArray(int initialSize)
{
}

};

class Node{};

int main
{
DynamicArray<Node*> nodes(1);
return 0;
}
нормально собралось под
C:\DIMA>gcc --version
gcc (GCC) 3.3.3 (cygwin special)

rosali

...нормально собралось...
если компилировать так
 
$ gcc -o x x.cpp
то скомпилируется, а если так
 
$ gcc -c x.cpp
$ gcc -o x x.o
то нет, потому что по имени "x.cpp" можно понять, что это c++, а по "x.o" нельзя. Так что gcc линкует без -lstdc++, а g++ -- с ней. При чем тут вообще gcc?

bleyman

Ох, что-то мне уже влом вырезать оттуда куски, честно. Твой кусок у меня тоже компильнулся.
Могу целиком запостить.
Короче, я понял, аффтары полные долбоёбы. И ещё проясняются некоторые вещи в отношении разнообразных линуксоидов, которые "ничего странного" в такой шняжке не замечают =)

bleyman

А, ну вот, ловите

#include <stdio.h>
#include <stdlib.h>

//////////////////////////////////////////////////////////////////////////

template <class Element> class DynamicArray
{
private:
Element * innerArray;
int count;
int size;
public:
DynamicArray(int initialSize)
{
}

int Add(Element element)
{
}

};

//////////////////////////////////////////////////////////////////////////

class Node
{
public:
int Key;
DynamicArray<Node*>* children;

void AddChild(Node * node)
{
if (NULL == this->children)
{
this->children = new DynamicArray<Node*>(1);
}
this->children->Add(node);
}

Node(int key, bool asLeaf)
{
}
};



int main
{
DynamicArray<Node*> nodes(1);
Node * node = new Node(1, false);
nodes.Add(node);
node->AddChild(node);
}

 ignatich:~$ gcc Spogulis.cpp
/tmp/ccIGFGdi.o(.text+0x2c): In function `main':
: undefined reference to `operator new(unsigned)'
/tmp/ccIGFGdi.o(.gnu.linkonce.t._ZN4Node8AddChildEPS_+0x1c): In function `Node::AddChild(Node*)':
: undefined reference to `operator new(unsigned)'
/tmp/ccIGFGdi.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
ignatich:~$ gcc --version
gcc (GCC) 3.3.5 (Debian 1:3.3.5-12)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ignatich:~$

Irina22

>Короче, я понял, аффтары полные долбоёбы.
так не надо компилировать прогу на одном языке компилятором для другого, пусть даже они очень похожи

ppplva

Короче, вындовые программеры по привычке ждут от компилятора проявления противоестественного интеллекта.
Не дождетесь

vall

просто нада -lstdc++ добавить и всё работает.

hoha32

И даже этот "противоестественный" интеллект не всегда срабатывает - в Visual Studio 6 прога на WinAPI в файле с расширением .cpp компилиться не захотела. Сменил на .c - и всё заработало =)

bleyman

> так не надо компилировать прогу на одном языке компилятором для другого, пусть даже они очень похожи
Для какого языка компилятор "gcc"? Только не надо говорить, что для С, потому что _компилирует_ он С++ по дефолту. Только линкует без библиотеки.

bleyman

> Короче, вындовые программеры по привычке ждут от компилятора проявления противоестественного интеллекта.
Какой нах противоестественный интеллект?
Если компилятор _по дефолту_ компилирует С, он должен компилировать С в полном объёме. Если компилятор _по дефолту_ компилирует С++, то он должен компилировать С++ в полном объёме. Если компилятор определяет язык по расширению - ок, пусть определяет и компилит в полном объёме.
Сделать компилятор, который умеет компилить С полностью и С++ _не_ _полностью_ (по дефолту и приложить к нему файлик g++, который добавляет ещё одну опцию к дефолтному поведению gcc (после чего он начинает компилить плюсы полностью) (и, возможно, ещё что-то, но это уже "надо глядеть в сурцы") - значит ёбнуться головой.
Вообще для симметрии очень не хватает таких компиляторов: который бы компилил С без стандартной библиотеки, и который всегда бы линковал либцпп но не умел компилить плюсы, и оба сразу. Для, блядь, ортогональности.

Julie16

Бля, какой ты умный. Ты согласен с тем что процесс компиляции и линковки - это 2 большие разницы? Вот и не трынди. И gcc, и g++ умеют компилировать c++. Линковать(без доп. опций) - g++. Что не так?

bleyman

Зачем гцц умеет компилить плюсы?
То есть ты серьёзно считаешь, что необходимость скомпилить и слинковать плюсовый файл без плюсовой либы настолько часта, что для этой цели написали СПЕЦИАЛЬНЫЙ КОМПИЛЯТОР, у которого на цпп именно такое поведение?

Julie16

Че значит "специальный компилятор"? И gcc, и g++ - две ОЧЕНЬ простых програмки-драйвера. Они ничего не комплируют. Это сделано исключительно для удобства. Ну и может быть исторические причины.
PS: gcc - универсальный драйвер. Обрабатывает все. У g++ другая задача - он например может по умолчанию c файлы обрабатывать как с++, к примеру. Добавляет -lstdc++. Может еще что-то.

Julie16

А вообще, чтобы не возникало таких вопросов, освой strace.

ppplva

Ну тебе же объяснили в самом начале треда. Компилировать оба умеют и C и C++. Определяют по расширению и опции -x.
На стадии линковки невозможно отличить С-объектник от С++-объектника без подключения п. интеллекта. Поэтому объективно необходимо иметь два линкера - gcc и g++.

bleyman

Я пишу строчку "gcc zzz.cpp" и жму ентер. Кто чего не может определить на какой стадии?

voronetskaya

понимаешь, когда ты пишешь "cl zzz.cpp" - cl - это и есть тот противоестественный интеллект, кторый сначала вызовет правильный компилятор, а потом и правильный линкер.
а тру юникс вэй - это когда противоестественным интеллектом обладаешь ты сам.

ppplva

C-линкер, который ты явным образом заказал, не может слинковать С++-объектник.

ppplva

У нас есть аналог cl.exe. Он называется g++. А Fj зачем-то вызывает gcc, видимо по незнанию. Неудивительно, что ничего не работает в итоге.

bleyman

Ябааать
А почему тогда gcc ВООБЩЕ вызывает линкер?
Почему когда я пишу gcc zzz.cpp "противоестественный интеллект" вызывает правильный компилятор и неправильный линкер?
Вот как раз это и есть "противоестественный интеллект" - который в некоторых случаях работает, а в некоторых - нет, и предугадать эти случаи логическим путём невозможно. Это мне как раз и не нравится. Если бы gcc по дефолту умела компилить только С, или не вызывала линкер вообше, я бы не говорил о долбанутости разработчиков. ИМХО лень гораздо меньший порок для разработчика нежели невменяемость.

bleyman

Приколись!
Если убрать из моего кода темплейт, и написать всё чисто на классах, то всё корректно слинкуется! Это противоестественно. Тулза должна делать либо одну вещь, либо обе, а делать полторы противоестественно.

bleyman

Я не заказывал явным образом С линкер (гы гы, линкеры там одинаковые, насколько я понимаю). Я сказал превратить мне файл zzz.cpp в дефолтный исполняемый файл ("a.out").

ppplva

Не вижу ничего противоестественного в том, что компилятор языка A справляется с некоторыми программами на языке B. Просто возьми за правило компилировать программы на C++ компилятором С++, и все будет хорошо.
некоторых случаях работает, а в некоторых - нет, и предугадать эти случаи логическим путём невозможно
Так ведь не наблюдается этого. Результат работы gcc/g++ вполне определен и легко предсказуем. Можно говорить максимум о нелогичности их поведения - и то спорно. Всем не угодишь. Поведение, которое так тебя удивило, вполне привычно для многих.

ppplva

линкеры там одинаковые, насколько я понимаю
Конечно. Корректно говорить о "C-линковке" и "C++-линковке". Вся разница между которыми, насколько я знаю, заключается в наборе подключаемых библиотек.

bleyman

> Результат работы gcc/g++ вполне определен и легко предсказуем.
Нука! Предскажи мне результат компиляции и линковки произвольной программы на языке С++ компилятором gcc!
> Не вижу ничего противоестественного в том, что компилятор языка A справляется с некоторыми программами на языке B.
gcc == GNU C and C++ compiler.
Он компилит .cpp файлы как c++. А линкует как С. Это - неестественный интеллект и маразм разработчиков. Нет?

Irina22

ну так это типа недокументированные функции..
ими пользоваться вроде как не стоит
вот с++ - небезопасный язык, в том плане, что надо знать, что делаешь, в этом же стиле и компилятрор

bleyman

Хуясе
Всё там документировано

ppplva

Нука! Предскажи мне результат компиляции и линковки произвольной программы на языке С++ компилятором gcc!
Есть вещи, которые лучше не делать. gcc не предназначен для сборки программ на С++.
Другое дело, что разработчики не предпринимали сверхусилий, чтобы _запретить_ это. Хочется приключений - пожалуйста. А мы будем юзать g++.
gcc == GNU C and C++ compiler.
Произошла типичная подмена понятий. GCC = GNU Compiler Collection.
Одновременно так же называется исполнимый файл из одноименного пакета, предназначенный для компиляции С программ.

bleyman

ignatich:~$ man gcc
Reformatting gcc(1 please wait...
GCC(1) GNU GCC(1)
NAME
gcc - GNU project C and C++ compiler

yolki

то, что ты набрал man gcc - тебе выдало инфу на экзешник "gcc". а пакет gcc - это другое - это некое ядро..

Name : gcc Relocations: (not relocateable)
Version : 3.3.1 Vendor: MandrakeSoft
Release : 2mdk Build Date: Mon 01 Sep 2003 04:50:28 PM MSD
Install Date: (not installed) Build Host: hp6.mandrakesoft.com
Group : Development/C Source RPM: gcc-3.3.1-2mdk.src.rpm
Size : 13031289 License: GPL
Signature : DSA/SHA1, Sun 09 Nov 2003 08:32:28 PM MSK, Key ID dcad59f9a7cc4679
Packager : Gwenole Beauchesne <gmandrakesoft.com>
URL : http://gcc.gnu.org/
Summary : GNU Compiler Collection
Description :
A compiler aimed at integrating all the optimizations and features
necessary for a high-performance and stable development environment.
This package is required for all other GCC compilers, namely C++,
Fortran 77, Objective C and Java.

If you have multiple versions of GCC installed on your system, it is
preferred to type "gcc-$(gcc3.3-version)" (without double quotes) in
order to use the GNU C compiler version 3.3.1.

В частности,

Name : gcc-g77 Relocations: (not relocateable)
Version : 3.3.1 Vendor: MandrakeSoft
Release : 2mdk Build Date: Mon 01 Sep 2003 04:50:28 PM MSD
Install Date: (not installed) Build Host: hp6.mandrakesoft.com
Group : Development/Other Source RPM: gcc-3.3.1-2mdk.src.rpm
Size : 4351788 License: GPL
Signature : DSA/SHA1, Sun 09 Nov 2003 08:32:30 PM MSK, Key ID dcad59f9a7cc4679
Packager : Gwenole Beauchesne <gmandrakesoft.com>
URL : http://gcc.gnu.org/
Summary : Fortran 77 support for gcc
Description :
This package adds support for compiling Fortran 77 programs with the GNU
compiler.

rosali

Если убрать из моего кода темплейт, и написать всё чисто на классах, то всё корректно слинкуется!
При чем тут темплейт. Если написать _без_ темплейта, но _с_ new, точно так же не слинкуется. Как и если воспользоваться std::cout, или исключениями, или любой другой c++-ной фигней. Ты что думаешь, что в libstdc++ находится какая-то "fucking magic"? Нет, там определены обыкновенные функции, вызовы которых компилятор вставляет при компиляции С++ кода.

rosali


если компилировать так
code:--------------------------------------------------------------------------------
$ gcc -o x x.cpp
--------------------------------------------------------------------------------
то скомпилируется
О! Я прогнал. Мне так же как и FJ показалось разумным, что в этом случае должна быть C++ линковка, а вот нет...
А вообще -lstdc++ надо знать! А то напушут какие-нибудь фанаты чистого Си посреди configure

CC=gcc
LD=$CC
и привет Кстати если кто не знает, g++ даже .c файлы компилирует с С++-ной проверкой типизации:

[xenon andrei]$ cat test.c
#include <stdlib.h>
int main
{
int * p = malloc(10);
return(0);
}

[xenon andrei]$ gcc test.c

[xenon andrei]$ g++ test.c
test.c: In function `int main':
test.c:4: error: invalid conversion from `void*' to `int*'
Так что в предыдущем примере просто написать
CC=g++
нельзя, надо именно
LDFLAGS=$LDFLAGS -lstdc++

evgen5555

Кстати если кто не знает, g++ даже .c файлы компилирует с С++-ной проверкой типизации
А что же ты хотел от "естественного" поведения?

Julie16

Я бы сказал иначе: g++ считает что .с файлы - это с++.

vall

все эти страшные беды с компилляций связаны с тем что в с\с++ модульность отсутствует.
ошибка не в gcc, ибо она была совершена когда-то давным давно, когда им ешё не пахло.
Оставить комментарий
Имя или ник:
Комментарий: