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

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