gcc сцука.
g++
gcc по умолчанию компилирует как c (не с++ соответственно никакого new там быть не должно.
*подбирает выпавшую челюсть* а gcc это что? Бтв, g++ закомпилило =)
man gcc, там всяко лучше написао, чем я тут скажу.
Видите ли, в C нет объектов, объявления переменных допустимы только сразу после открывающей фигурной скобки етс.
У меня есть вопрос - что компилит gcc? Да, кстати, _компилятор_ не ругается, ругается линкер.
наверно он компилить-то компилит, но нет у него с++ библиотек, вот он и ругается
Ну, типа того...

а вот кусок мана:
А поскольку оба этих бинарника являются страшными оболочками над еще большим количеством бинарников, то разбираться как там все в точности устроено, я для себя всегда считал делом бесперспективным.
gcc assumes preprocessed (.i) files are C and assumes C
style linking.
g++ assumes preprocessed (.i) files are C++ and assumes
C++ style linking.
gcc -v поможет отцу русской демократии
У меня такое
нормально собралось под
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)
...нормально собралось...если компилировать так
то скомпилируется, а если так
$ gcc -o x x.cpp
то нет, потому что по имени "x.cpp" можно понять, что это c++, а по "x.o" нельзя. Так что gcc линкует без -lstdc++, а g++ -- с ней. При чем тут вообще gcc?
$ gcc -c x.cpp
$ gcc -o x x.o

Могу целиком запостить.
Короче, я понял, аффтары полные долбоёбы. И ещё проясняются некоторые вещи в отношении разнообразных линуксоидов, которые "ничего странного" в такой шняжке не замечают =)
#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:~$
так не надо компилировать прогу на одном языке компилятором для другого, пусть даже они очень похожи
Не дождетесь

просто нада -lstdc++ добавить и всё работает.
И даже этот "противоестественный" интеллект не всегда срабатывает - в Visual Studio 6 прога на WinAPI в файле с расширением .cpp компилиться не захотела. Сменил на .c - и всё заработало =)
Для какого языка компилятор "gcc"? Только не надо говорить, что для С, потому что _компилирует_ он С++ по дефолту. Только линкует без библиотеки.
Какой нах противоестественный интеллект?
Если компилятор _по дефолту_ компилирует С, он должен компилировать С в полном объёме. Если компилятор _по дефолту_ компилирует С++, то он должен компилировать С++ в полном объёме. Если компилятор определяет язык по расширению - ок, пусть определяет и компилит в полном объёме.
Сделать компилятор, который умеет компилить С полностью и С++ _не_ _полностью_ (по дефолту и приложить к нему файлик g++, который добавляет ещё одну опцию к дефолтному поведению gcc (после чего он начинает компилить плюсы полностью) (и, возможно, ещё что-то, но это уже "надо глядеть в сурцы") - значит ёбнуться головой.
Вообще для симметрии очень не хватает таких компиляторов: который бы компилил С без стандартной библиотеки, и который всегда бы линковал либцпп но не умел компилить плюсы, и оба сразу. Для, блядь, ортогональности.
Бля, какой ты умный. Ты согласен с тем что процесс компиляции и линковки - это 2 большие разницы? Вот и не трынди. И gcc, и g++ умеют компилировать c++. Линковать(без доп. опций) - g++. Что не так?
То есть ты серьёзно считаешь, что необходимость скомпилить и слинковать плюсовый файл без плюсовой либы настолько часта, что для этой цели написали СПЕЦИАЛЬНЫЙ КОМПИЛЯТОР, у которого на цпп именно такое поведение?
PS: gcc - универсальный драйвер. Обрабатывает все. У g++ другая задача - он например может по умолчанию c файлы обрабатывать как с++, к примеру. Добавляет -lstdc++. Может еще что-то.
А вообще, чтобы не возникало таких вопросов, освой strace.
На стадии линковки невозможно отличить С-объектник от С++-объектника без подключения п. интеллекта. Поэтому объективно необходимо иметь два линкера - gcc и g++.
Я пишу строчку "gcc zzz.cpp" и жму ентер. Кто чего не может определить на какой стадии?
а тру юникс вэй - это когда противоестественным интеллектом обладаешь ты сам.
C-линкер, который ты явным образом заказал, не может слинковать С++-объектник.
У нас есть аналог cl.exe. Он называется g++. А Fj зачем-то вызывает gcc, видимо по незнанию. Неудивительно, что ничего не работает в итоге.
А почему тогда gcc ВООБЩЕ вызывает линкер?
Почему когда я пишу gcc zzz.cpp "противоестественный интеллект" вызывает правильный компилятор и неправильный линкер?
Вот как раз это и есть "противоестественный интеллект" - который в некоторых случаях работает, а в некоторых - нет, и предугадать эти случаи логическим путём невозможно. Это мне как раз и не нравится. Если бы gcc по дефолту умела компилить только С, или не вызывала линкер вообше, я бы не говорил о долбанутости разработчиков. ИМХО лень гораздо меньший порок для разработчика нежели невменяемость.
Если убрать из моего кода темплейт, и написать всё чисто на классах, то всё корректно слинкуется! Это противоестественно. Тулза должна делать либо одну вещь, либо обе, а делать полторы противоестественно.
Я не заказывал явным образом С линкер (гы гы, линкеры там одинаковые, насколько я понимаю). Я сказал превратить мне файл zzz.cpp в дефолтный исполняемый файл ("a.out").
некоторых случаях работает, а в некоторых - нет, и предугадать эти случаи логическим путём невозможноТак ведь не наблюдается этого. Результат работы gcc/g++ вполне определен и легко предсказуем. Можно говорить максимум о нелогичности их поведения - и то спорно. Всем не угодишь. Поведение, которое так тебя удивило, вполне привычно для многих.
линкеры там одинаковые, насколько я понимаюКонечно. Корректно говорить о "C-линковке" и "C++-линковке". Вся разница между которыми, насколько я знаю, заключается в наборе подключаемых библиотек.
Нука! Предскажи мне результат компиляции и линковки произвольной программы на языке С++ компилятором gcc!
> Не вижу ничего противоестественного в том, что компилятор языка A справляется с некоторыми программами на языке B.
gcc == GNU C and C++ compiler.
Он компилит .cpp файлы как c++. А линкует как С. Это - неестественный интеллект и маразм разработчиков. Нет?
ими пользоваться вроде как не стоит
вот с++ - небезопасный язык, в том плане, что надо знать, что делаешь, в этом же стиле и компилятрор
Всё там документировано
Нука! Предскажи мне результат компиляции и линковки произвольной программы на языке С++ компилятором gcc!Есть вещи, которые лучше не делать. gcc не предназначен для сборки программ на С++.
Другое дело, что разработчики не предпринимали сверхусилий, чтобы _запретить_ это. Хочется приключений - пожалуйста. А мы будем юзать g++.
gcc == GNU C and C++ compiler.Произошла типичная подмена понятий. GCC = GNU Compiler Collection.
Одновременно так же называется исполнимый файл из одноименного пакета, предназначенный для компиляции С программ.
ignatich:~$ man gcc
Reformatting gcc(1 please wait...
GCC(1) GNU GCC(1)
NAME
gcc - GNU project C and C++ compiler
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.
Если убрать из моего кода темплейт, и написать всё чисто на классах, то всё корректно слинкуется!При чем тут темплейт. Если написать _без_ темплейта, но _с_ new, точно так же не слинкуется. Как и если воспользоваться std::cout, или исключениями, или любой другой c++-ной фигней. Ты что думаешь, что в libstdc++ находится какая-то "fucking magic"? Нет, там определены обыкновенные функции, вызовы которых компилятор вставляет при компиляции С++ кода.
О! Я прогнал.
если компилировать так
code:--------------------------------------------------------------------------------
$ gcc -o x x.cpp
--------------------------------------------------------------------------------
то скомпилируется

А вообще -lstdc++ надо знать! А то напушут какие-нибудь фанаты чистого Си посреди configure
и привет
CC=gcc
LD=$CC

Так что в предыдущем примере просто написать
[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++
Кстати если кто не знает, g++ даже .c файлы компилирует с С++-ной проверкой типизацииА что же ты хотел от "естественного" поведения?
Я бы сказал иначе: g++ считает что .с файлы - это с++.
ошибка не в gcc, ибо она была совершена когда-то давным давно, когда им ешё не пахло.
Оставить комментарий
bleyman
И что вы таки себе думаете?Естественно, м$ компилятор всё компилит. Wtf?