[c++] поясните дураку плиз ошибки

vlfdimir58


#include <stdio.h>
#include <math.h>
int lookit(const char* fo) {

FILE *IN = fopen(fo, "r");
double a, b, c, d;
int era, erb, erc;
int type; // 3 - constant, 1 - arithmetic, 2 - geometric, 0 - unknown
if (IN)
{
era = fscanf(IN, "%d", &a);
if (era == 0) return -2;
if (feof(IN return 4;
erb = fscanf(IN, "%d", &b);
if (erb == 0) return -2;
if (feof(IN {
if (a*b == 0) return 1; else return 4;
}
erc = fscanf(IN, "%d", &c);
if (erc == 0) return -2;
else {
if (a == b && b == c) type = 3; else
if (a*b*c == 0) {
if (b-a == c-b) type = 1; else
type = 0;
}
else if (b*b == a*c) type = 2; else
if (b-a == c-b) type = 1; else
type = 0;
}
while (!feof(IN {
if (fscanf(IN, "%d", &d) == 0) {
return -2;
} else {
switch (type) {
case 3 :
if (d != c) type = 0;
break;
case 1 :
if (fabsd-a)/(b-a) - rintd-a)/(b-a > 1e-10) type = 0;
break;
case 2 :
if (fabs(log(d/a)/log(b/a)- rint(log(d/a)/log(b/a > 1e-6) type = 0;
break;
}
}
}

fclose(IN);
} else return -1;

return type;
}
int main {
char w[10];
scanf("%s", w);
printf("%d", lookit(w;

return lookit(w);
}


компилятор gcc version 3.3.3 [FreeBSD] 20031106 и gcc version 3.2.2 20030222 (ASPLinux 3.2.2-5asp)
говорят следующее:

/var/tmp//ccB7wbAy.o: In function `lookit(char const*)':
/var/tmp//ccB7wbAy.o(.text+0x28d): undefined reference to `rint'
/var/tmp//ccB7wbAy.o(.text+0x2cc): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x2e7): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x307): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x322): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x337): undefined reference to `rint'
/var/tmp//ccB7wbAy.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'


Поясните плиз....

Marinavo_0507

-lm добавь

Chupa

-lm забыл

Chupa

мля, опередил

maggi14

Так -lm ведь, вроде, должен иметь значение на этапе линковки, а ошибки выдает компилятор? Или я не прав?

vlfdimir58

хе, под ASP скомпилилось, а под FreeBSD осталось вот чего:

/var/tmp//cc36jRY2.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'

Chupa

"g++" вызывай или "gcc -x c"

Marinavo_0507

наверное, ты не так компилируешь

vlfdimir58

gxx -lm делал
сейчас с g++ сделаю

vlfdimir58

ага, пашет, спасибо!

vlfdimir58

а можешь рассказать теперь, что это было?

maggi14

подключение матбиблиотек.
2Отцы: так мне кто-нибудь ответит?

Marinavo_0507

В gcc компилятор (точнее, фронтэнд) вызывает линкер при необходимости.

Chupa

Вся ругань от линковщика:
Это от отсутствия -lm:
/var/tmp//ccB7wbAy.o(.text+0x28d): undefined reference to `rint'
/var/tmp//ccB7wbAy.o(.text+0x2cc): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x2e7): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x307): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x322): undefined reference to `log'
/var/tmp//ccB7wbAy.o(.text+0x337): undefined reference to `rint'
Это от компиляции плюсового кода (автоопределение по расширению) с помощью gcc:
/var/tmp//ccB7wbAy.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
Линковщику передаётся не тот набор используемых библиотек (сишный вместо плюсового).
Обходится (кроме переименования исходника) или явным указанием языка (-x c
или компиляцией с помощью g++, чтобы линкеру сообщить все необходимые параметры.

sergey_m

Уже второй раз вижу, что ты постишь программу на языке це, а в сабжекте пишешь ++.

Marinavo_0507

Это не С, по крайней мере не ANSI.

vlfdimir58

каюс =)

yolki

Покажи, плиз, что там не удовлетворяет стандарту ISO9899 ?

Marinavo_0507

а покажи сначала сам этот стандарт, у меня нет
но думаю, что как минимум комментарий //

sergey_m

> а покажи сначала сам этот стандарт, у меня нет
Даже гур иногда посылают в FAQ.

Marinavo_0507

А, так он про C99?
Ну это ж новомодная штука, а раньше компилировали как C++, для того чтобы получать // и const

yolki

Хехе раньше и прототипов не было. и функции по-другому определялись и переменные можно было только в главном блоке заводить

Marinavo_0507

Ну я не про K&R всё-таки, а про нормальный ANSI C (1989г. кажется)

rosali

по крайней мере не ANSI

Вообще-то так и не стало понятно...
gcc, он что сам определиться не может, что он компилирует, C или C++?
Если он думает, что компилирует C то зачем он генерирует reference на этот gxx_personality_...,
если он думает, что компилирует С++, почему линкует c libc? Фигня какая-то...

Marinavo_0507

думаю потому, что можно писать на некотором подмножестве C++ так, чтобы не требовалось дополнительных библиотек
c libc линковаться в любом случае afaik

yolki

Ага, с libc не надо линковаться, если не используется ни одна из функций из стандартной библиотеки:
1) Ввод-вывод printf, scanf, fopen (в С++ пользовать iostreams, cin, cout)
2) динамическая память: malloc/free ... (C++ : new/delete)
3) работа со строками strcmp, strstr, strdup,...(C++: basic_string)
перечислять всю libc я думаю не имеет смысла - это наиболее часто используемые оттуда функции и далеко не все приплюснутые насильники (с) полностью пользуются только плюсовыми методами

Marinavo_0507

что-то я не понял, что ты хотел сказать этим

bleyman

Если меня не совсем еще глючит, то new написан через маллок. Я сам видел код! Даже довольно часто вижу - каждый раз когда мимо памяти промахиваюсь =)
Есть подозрение, что и все остальное, перечисленное тож активно юзается кодом из либц.

sergey_m

Насколько я понимаю сисколлы в любом случае нужны. А они для юзерленд программы выглядят как функции из libc. Так что libc по-любому нужна.

rosali

Да чего там говорить, то место где вызывается main находится где-то в libc так что без него никак... Или может кто-то считает что работа программы начинается с main?
Я не противопоставляю "прилинковывать/не прилинковывать libc", я противопоставляю "прилинковывать libc/libstdc++"...
По-моему дело просто в том, что в gcc указанных версий ошибка ~ фича, состоящая в том, что правила, по которым определяется язык (C/C++) отличаются на этапе компиляции и линковки. Хотя может и в чем-то другом дело... А кто-нибудь знает вообще про что этот gxx_personality? MT?

sergey_m

Или может кто-то считает что работа программы начинается с main?
прикольная ссылка в тему

bobby

охрененная ссылка, спасибо! =)

bleyman

Рулезззз!
Сцылка!
Рулеззззз!
Оставить комментарий
Имя или ник:
Комментарий: