C и KDevelop

Автор: ElektroMan Дата: 22.12.2006 18:30 Короче тут такое дело: я ламобот(пока что Улыбка).Учусь на первом курсе в универе на кодера. Мы начали С проходить, но только в винде -ТурбоСи.Мне тут взбрело в голову в Лине наши задачки покодить и я столкнулся с проблемой: при компиляции моей проги с препроцессорной инструкцией math.h компилятор ругается на синусы, косинусы и т.д. Тык вот может мне кто-нить объяснить в чем беда, пока я не купил книгу по кодингу в Лине?
Большой пардон за ламоботский вопрос, аж самому стыдно Грустный
Re: C и KDevelop 23.12.2006 06:33Bircoph А KDevelop тут при чём?!

Если хочешь научиться писать программы в Линухе, то vim, gcc,
make и gdb тебе в руки, когда посерьёзнее вещи делать
начнёшь, добавь туда valgrind (но пока, имхо, тебе это рано).

Забудь о KDevelop и прочих гуёвых прирблудах.

> при компиляции моей проги
> с препроцессорной инструкцией math.h компилятор ругается на
> синусы, косинусы и т.д. Тык вот может мне кто-нить объяснить в
> чем беда, пока я не купил книгу по кодингу в Лине?

Код ошибки хотя бы приведи. А ещё лучше, и кусок программы,
где эта ошибка возникакет. Я не телепат, и остальные -- тоже.
Re: C и KDevelop 23.12.2006 20:26ElektroMan Вас не затруднит объяснить, чем плохи графические системы разработки и чем лучше текстовые?
А вообще есть псевдографические Турбосистемы под Линь?
Re: C и KDevelop 23.12.2006 20:55ElektroMan Вот собс-но прога:
#include <stdio.h>
#include <math.h>
void main(void)
{
float M,x,y,P,A1,A2,A3;
printf(" Введите переменную X :";-);
scanf("%g",&x);
printf(" Введите переменную Y :";-);
scanf("%g",&y);
M=((sin(x)+cos(y))/(x*y-1))+pow(2,(-x*y));
printf(" Значение М=%12.5E",M);
printf(" Введите переменную A1 :";-);
scanf("%g",&A1);
printf(" Введите переменную A2 :";-);
scanf("%g",&A2);
printf(" Введите переменную A3";-);
scanf("%g",&A3);
P=2.54*log(A1)+A2*A2+1/(A3);
printf(" Значение P=%12.5E",P);
}
А вот ерроры:
/home/irvin/C++/lab5/src/lab5.c:29: undefined reference to `sin'
lab5.o(.text+0x7e):/home/irvin/C++/lab5/src/lab5.c:29: undefined reference to `cos'
lab5.o(.text+0xbb):/home/irvin/C++/lab5/src/lab5.c:29: undefined reference to `pow'
lab5.o(.text+0x15c):/home/irvin/C++/lab5/src/lab5.c:37: undefined reference to `log'
collect2: ld returned 1 exit status
gmake[2]: *** [lab5] Ошибка 1
gmake[2]: Цель `all' не была пересобрана из-за ошибок.
gmake[1]: *** [all-recursive] Ошибка 1
gmake: *** [all] Ошибка 2
*** Завершено с кодом: 2 ***
Re: C и KDevelop 24.12.2006 18:50ElektroMan Тык дело в math.h или нет?? Такие очучения, что эта либа не работает (( (насколько подсказывает мне мой ламоботский дух)
Re: C и KDevelop 24.12.2006 19:31Bircoph > Вас не затруднит объяснить, чем плохи графические системы
> разработки и чем лучше текстовые?

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

Кроме того, в Linux нет такого бреда, как интеграция всех
иснструментов разработки (компилятор, линвощик, отладчик,
редавтор и т.п.) в одно целое. Это не Unix-way. Все эти
графические среды есть лишь интерфейсы к тем же самым
консольным программам. Если вы их будете использовать, то
ничему не научитесь и даже Makefile сами не напишете.

> А вообще есть псевдографические Турбосистемы под Линь?

Есть, xwpe, например. Только её разработку, похоже, давно
забросили.

> Тык дело в math.h или нет??

Дело в вашем непонимании процесса компиляции, виной чему есть
ваше использование kdevelop.

Кто за вас будет линковать библиотеку? Передайте gcc
параметр -lm.

Ещё раз повторюсь, используйте ранее указанную мной связку
(если для вас пока тяжело работать в vim, возьмите другой
редактор, пусть даже kate) -- главное, компилируйте
самостоятельно.
Re: C и KDevelop 31.01.2007 17:14Vanich ммм
Я присоединяюсь к автору темы.

ТОгда такой вот пример:
Есть некий файл file.cpp
Надо его открмпилить и запустить на выполнение.

Как это сделать.

Синтаксис верный.

кроме iostream.h
используется stdio.h
и conio.h

Лично для меня вопрос актуальный.

Поделитесь ссылками на документацию по созданию make файла.
И неплохобы какие нибудь аналоги BC.
Моно даже гуевые.
Re: C и KDevelop 06.02.2007 01:12Bircoph > Как это сделать.

А что именно не работает? Какие ошибки. У предыдущего автора
не выполнялась линковка мат. библиотеки.

> Поделитесь ссылками на документацию по созданию make файла.

info make
Re: C и KDevelop 16.10.2007 16:30complex Народ!! Одумайтесь! Я сам люблю Анюту, но при этом внемательно смотрю на ход процеса зборки. Проблема не с какими-либо файлами от графической утилиты, а непосредственно с компановщиком. Поясняю. есть файл name.c вы его компилируете(где угодно), в выводе(косоли/терминала) ищите строку типа:
gcc .....-o name.o name.c
эта стадия проходит нормально. При попытке компановщика подключить файл <math.h> вы и получаете эту ругань. Дело в том, что большинство (если не все) функций из <math.h> работают с переменнымы типа double. Чтобы компановщик смог правильно скомпоновать их ему надо запустить некий скрипт из файла <math.h>, который по умолчанию отключен.
Решение проблемы.
При компиляции добавляйте ключ -ffast-math. Например
gcc -ffast-math -g -Wall -o name name.c
Но есть маленкое но... Оптимизировать програму клучами типа -Ox (x=1-3) нельзя, так как можно получить некоректные результаты. Фактически ключ -ffast-math и есть оптимизация. Для более детального ознакомления c работай компилятора сделайте поиск по man странице gcc
man gcc
/math
:q
Re: C и KDevelop 16.10.2007 18:40Bircoph > При попытке компановщика подключить файл <math.h> вы и
> получаете эту ругань. Дело в том, что большинство (если не
> все) функций из <math.h> работают с переменнымы типа
> double. Чтобы компановщик смог правильно скомпоновать их
> ему надо запустить некий скрипт из файла <math.h>, который
> по умолчанию отключен.

Бред сивой кобылы. Я уже не одну сотню програм с math.h
откомпилировал и ничего.

> Оптимизировать програму клучами типа -Ox (x=1-3) нельзя,
> так как можно получить некоректные результаты.

Лежал под столом. Не можно, а нужно оптимизировать. Всё
работает корректно, за исключением неграмотно написанного
кода, в котором НЕ инициализируются переменные (при -O0 все
они забиваются нулями) или не используются флаги volatile.

> Фактически ключ -ffast-math и есть оптимизация. Для более
> детального ознакомления c работай компилятора сделайте
> поиск по man странице gcc

Ещё один кусок бреда. Видимо, вы плохо читали man gcc.
-fast-math отключает проверки в мат. библиотеках, за счёт
чего код работает быстрее, но с нарушением ISO, в результате
чего корректно написанные программы могут работать неверно.
man gcc:
---
-ffast-math
Sets -fno-math-errno, -funsafe-math-optimizations, -fno-trapping-math, -ffinite-math-only, -fno-rounding-math,
-fno-signaling-nans and fcx-limited-range.

This option causes the preprocessor macro "__FAST_MATH__" to be defined.

This option should never be turned on by any -O option since it can result in incorrect output for programs which
depend on an exact implementation of IEEE or ISO rules/specifications for math functions.
---
Re: C и KDevelop 16.10.2007 19:57complex ElektroMan писал(а):

>Лежал под столом. Не можно, а нужно оптимизировать. Всё
>работает корректно, за исключением неграмотно написанного
>кода, в котором НЕ инициализируются переменные (при -O0 все
>они забиваются нулями) или не используются флаги volatile.

на сколько я понимаю при использовании -ffast-math оптимизацию типа -Ox лучше отключить. В других случаях её можно испольховать. Хотя лично я незачал разницы при ее наличии или отсутсвии с флагом -ffast-math

А вот вам задача:
1)Попробуйте найти ошибку и если ее нет
2)попробуйте собрать следующую программу без флага -ffast-math

#include <stdio.h>
#include <math.h>

int main()
{
double x = 3;

printf("%lf",sin(x));

return 0;
}
Лично у меня ни на ASP11.2, ни на Fedora 7 не получилось. А если у вас получится, очень прошу научите как вы это сделали. Заранее спасибо.

P.S. компиляция g++ проходит на ура.
Re: C и KDevelop 16.10.2007 22:10peter_ir Никогда не использовал fast-math, но всегда компилирую с O3, в т.ч. и вышеприведённое в
ASP11 вызовом gcc, только вместо printf написал fprintf(stdout,"%14.6e ",sin(x)).
Что касается g++ - обычно бывает наоборот, т.к. в g++ более строгий контроль типов.
Вообще всё это какой-то бред, либо я не понимаю, о чём речь.
Re: C и KDevelop 16.10.2007 22:57Bircoph 2 complex:

> на сколько я понимаю при использовании -ffast-math
> оптимизацию типа -Ox лучше отключить.

Так делать просто глупо. -ffast-math -- это один из "крайних"
методов оптимизации программы, когда вам нужно ускорить её
любой ценой, даже за счёт потери стабильности.

-Ox -- это гораздо более сильный набор оптимизаций и
отключение его ради -ffast-math просто неоправданно глупо.
С -ffast-math нужно быть очень осторожным и понимать, как
работает этот набор опций. Вы же, насколько я вижу, не имеете
никакого представления о механизмах оптимизации С кода.

> А если у вас получится, очень прошу научите как вы это
> сделали.

Читайте, пожалуйста, посты других людей. Я уже __выше__
писал, что нужно линковаться с математической библиотекой.
Беру код вашей программы, компилирую его и запускаю:
---
gcc math_test.c -o math_test -lm
./math_test
0.141120
---
Ещё есть вопросы?

Вы даже не понимаете механизмов линковки и исполнения
объектных файлов, а лезете в такие тонкие материи, как
оптимизация за счёт потери стабильности. Книжку хорошую
по С в Linux почитайте, полезно будет.

2 peter_ir:

> но всегда компилирую с O3

Это тоже не совсем правильно, хотя тут уже гораздо более
тонкий момент. -O3 отличается от -O2 только следующими
опциями:
-finline-functions, -funswitch-loops и -fgcse-after-reload

Последние две (почти всегда) безвредны и даже полезны. А вот
первая -- это особый разговор. Использование inline функций
уменьшает число инструкций, которые нужно исполнить за счёт
вставки тела небольших функций (вместо вызова самих функций)
непосредственно в исполняемый код. Таким образом вы, казалось
бы, экономите на операциях со стеком, передачей параметров,
сохранением и загрузкой регистров.

Но(!), тем самым вы раздуваете программный код, он
становится больше; а у современных процессоров есть такая
штука, как кэш исполняемых инструкций, который маленький, но
очень быстрый (в десятки раз быстрее доступа к оперативной
памяти). Так вот, чем компакнее ассмблерный код, тем быстрее
он работает (ну, на самом деле ещё нужно учитывать тайминги
самих инструкций, т.к. они сильно различаются). А inline
функции, раздувая код, заметно снижают эффективность работы
кеша, что замедляет работу программы.

В общем случае наиболее быстрый код даёт -O2 -funswitch-loops
-fgcse-after-reload, что, впрочем, не очень сильно отличается
от -O2. Но с -O3 нужно быть очень аккуратным, можно заметно
и потерять в быстродействии кода. И не забывайте о сборке
под конкреную архитектуру (-march=...), это не менее важно,
чем -Ox, т.к. позволяет gcc использовать mmx, mmxext, sse,
sse2, sse3, 3dnow, 3dnowext, altivec и прочие платформно-
зависимые вкусности.

> Вообще всё это какой-то бред, либо я не понимаю, о чём
> речь.

Нет, это действительно бред, бред человека, не
разобравшегося в азах, но почему-то полезшего дальше и
очень глубоко.
Re: C и KDevelop 17.10.2007 09:16peter_ir Bircoph, благодарю за рязъяснение. -march я всегда применяю. У меня иногда действительно
исполбзуются очень короткие функции, в один оператор или из нескольких, если они при -O3
вставляются прямо в код, то против этого я ничего не имею.
Re: C и KDevelop 17.10.2007 12:06Ьфдфлрщм автору поста надо посоветовать доки читать( man'ы ), там усе написано как
чего компилять.
Compile with -std=c99; link with -lm.
выдержка из мана.
Re: C и KDevelop 18.10.2007 16:27complex 2 Bircoph
Все, все, все. Признаю свою некомпетентность, погорячился. Ну ненадо же так сразу с горяча рубить. В связи с этип позвольте у вас проконсультироватся как знать какой архив (libname.a) из ${prefix}/include надо подключать с флагом -lname ? Наппример, если при компиляции происходит ругань (не очивидная для понимания) и вызвана она отсутсвием флага -lname, то как можно узнать какой параметр передать вместо name? Заранее спасибо.
Re: C и KDevelop 18.10.2007 19:50peter_ir Опять не понял логики. А если попробовать указать именно -lname ?
Re: C и KDevelop 18.10.2007 20:10Bircoph Обычно программист должензанть имя библиотеки, если оно вам
не известно по ряду причин (например, чужую программу
компилируете), то такую библиотеку можно найти по имени
неразвешённого символа, используя одну программку ;-).
Re: C и KDevelop 18.10.2007 20:18complex peter_ir писал(а):

> Опять не понял логики. А если попробовать указать именно -lname
> ?

Я про то что в предыдущих сообщениях дали ясно понять, что при компиляции проги, которая содержит math функции нужно подключать библиотеки флагом -l. Например для примера выше gcc math_test.c -o math_test -l<name>. где <name> означает библиотечный файл-архив lib<name>.a (как я понимаю). Так у меня вопрос, а как мне знать какой файл тип lib<name>.a мне следует подключить флагом -l при компиляции? Заранее спасибо.
Re: C и KDevelop 19.10.2007 12:50Bircoph Вы снова не читаете мои посты.
В документации на функции обычно показывется, как их
использовать. Если же этой информации нет, то нужно искать
по имени неразрешённого символа.

В принципе, можно сделать скрипт на основе objdump, но это
чертовски медленно работает. Готовых решений я не нашёл,
поэтому я написал одну программку, которая это делает.
Правда, она ещё до конца не дописана, но пользоваться уже
можно, лучше брать из svn, т.к. в тарболе есть баги:
---
svn co [symbol-lookup.svn.sourceforge.net] symbol_lookup
---
RSS-материал