Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: pow + Linux. Компиляция.  (Прочитано 21551 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Maksir
Постоялец

ru
Offline Offline

« : 07-04-2008 13:43 » 

Здравствуйте!

я тоже новичок и столкнулся с этой же проблемой.. Подскажите, что за грабли и куда бежать?

функция pow(); как было написанно в очебнике -> с поддержкой заголовочного файла math.h
компилятор ругается на эту функцию.

у меня задача, выяснить, к какому заголовочному файлу обращаться при определённых задачах вообще. В этом случае идёт речь о заголовочном файле math.h и якобы в нём математические функции. Может быть, это в Win среде так, но в Linux кажется не так всё.

Подскажите, можно ли посмотреть исходный код заголовочных файлов, если да, то где?

Есть ли ссылки по данному вопросу, где можно найти удобную справку по каждой функции.

Работаю в ArchLinux

Спасибо!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-04-2008 20:21 » 

Код:
$ man pow

POW(3)                     Linux Programmer’s Manual                    POW(3)

NAME
       pow, powf, powl - power functions

SYNOPSIS
       #include <math.h>

       double pow(double x, double y);
       float powf(float x, float y);
       long double powl(long double x, long double y);

       Link with -lm.

DESCRIPTION
       The pow() function  returns the value of x raised to the power of y.

ERRORS
       The pow() function can return the following error:

       EDOM   The  argument x is negative and y is not an integral value.  This would result in a complex number.

CONFORMING TO
       SVr4, 4.3BSD, C89.  The float and long double variants are C99 requirements.

SEE ALSO
       cbrt(3), cpow(3), sqrt(3)

Если у тебя нет такого заголовка, то, видимо, ты не поставил glibc-devel.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 08-04-2008 04:43 » 

Maksir, приведи сообщение об ошибке
Периодически натыкаюсь на грабли, когда передаю туда два целочисленных типа. Проблема в том, что у pow есть несколько перегруженных реализаций(ну в STLport точно), и при передаче целочисленных значений компилятор видит, что из-за неявного приведения подходят 2-3 функции, на что он и орёт лечится обычно статик кастом параметров к нужному типу
Записан

Странно всё это....
Maksir
Постоялец

ru
Offline Offline

« Ответ #3 : 09-04-2008 12:27 » 

Здравствуйте!
я решил поискать загаловочные файлы, что бы разобраться, чего у меня есть вообще, и вот такая путаница получается;

ищу stdio.h

./include/wine/msvcrt/stdio.h
./include/isc/stdio.h
./include/bits/stdio.h
./include/c++/4.2.1/tr1/stdio.h
./include/stdio.h
./lib/klibc/include/stdio.h
./lib/gcc/i686-pc-linux-gnu/4.2.1/include/ssp/stdio.h

ищю math.h

./include/wine/msvcrt/math.h
./include/c++/4.2.1/tr1/math.h
./include/math.h

==> wine отпадает, это понятно. Вижу каталог C++ - это уже ближе, и include. Но по запросу stdio.h выбор больше...

Где жизненноважные каталоги для компиляции?

Код:
$ man pow

POW(3)                     Linux Programmer’s Manual                    POW(3)


Если у тебя нет такого заголовка, то, видимо, ты не поставил glibc-devel.
Присутствует
Maksir, приведи сообщение об ошибке

$ gcc fid04_06.c -o fid04_06
fid04_06.c:18:3 warning: no newline at end of file
/tmp/ccqPAAau.o: In function `main`:
fid04_06.c:(.text+0x5c): undefined reference to `pow`
collect2: Выполнение id завершилось с кодом возврата 1

Вот исходный код программы:

/* fig04_06.c
вычисление сложных процентов */
#include <stdio.h>
#include <math.h>

   int main() {
   
   int year;
   double amount, principal = 1000.0, rate = 0.5;
   
   printf( "%4s%21s\n", "Year", "Amount on deposit" );
   
   for ( year=1; year<=10; year++ ) {
   amount = principal * pow( 1.0 + rate, year );
   printf( "%4s%21.2f\n", year, amount );
   }
return 0;
   }
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 09-04-2008 12:56 » 

Maksir, а библиотеку подлинковать разве не надо?

gcc -Wall fid04_06.c -o fid04_06 -lm

Кроме того, у тебя ошибка в формате printf - не "s", а "d"!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 10-04-2008 04:09 » 

RXL, согласен
Записан

Странно всё это....
Maksir
Постоялец

ru
Offline Offline

« Ответ #6 : 10-04-2008 10:07 » new

Maksir, а библиотеку подлинковать разве не надо?

gcc -Wall fid04_06.c -o fid04_06 -lm

Кроме того, у тебя ошибка в формате printf - не "s", а "d"!

Взял код в книге "Как программировать на C++" (второе издание) Там ещё и javaScript есть. Книга толстенная, но ориентирована для Win. Код скатал один в один. Но, я проверию ещё раз.
По поводу строчки:
gcc -Wall fid04_06.c -o fid04_06 -lm
Можно поподробнее. у меня с английским проблемы. Если можно, хотя бы для ориентира
Спасибо!
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-04-2008 15:40 » 

Английский надо учить - на "не знаю" далеко не уедешь.

Соотв., читай pinfo gcc и man gcc

Я добавил в твою строчку два параметра:
-Wall - определяет выводимые gcc ошибки (тут - all - все).
-lm - ключ "-l" задает библиотеку для линковки. Имя задается без ведущего "lib", суффикса ".so" и номеров версии.

Про printf читай pinfo libc или man printf
« Последнее редактирование: 10-04-2008 15:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 11-04-2008 03:34 » 

поправочка -W флажек определяющий выводимые предупреждения, если нужно все предупреждения сделать ошибками, то -Werror

оффтоп:
кстати есть такой флаг -Weffc++ включается проверку кода, на соотвествие рекомендациям Скота Мейерса Улыбаюсь как-то раз я его включил, это была жесть Улыбаюсь правда не в нашем коде, а бусте с стлпортом.
Записан

Странно всё это....
Maksir
Постоялец

ru
Offline Offline

« Ответ #9 : 11-04-2008 10:49 » 

Ура! =)
Справился => в книге сё правильно, это у меня близорукость.. =))
Исправил s на d
В книге, там всё подробно описанно. Про d и s дескрипторы. Просто, это я неправильно скатал.
А, вот про:
-lm - ключ "-l" задает библиотеку для линковки. Имя задается без ведущего "lib", суффикса ".so" и номеров версии
Там, конечно же ничего не написанно.. Эта книга для юзверей Windows.

Спасибо, всё получилось!

Вот, по man gcc - мне такую справку не осилить...
я так понял "-l" и первая буква 'библиотеки/заголовочного файла' т.е. "m" => math.h
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 11-04-2008 11:06 » 

Maksir, неверный вывод.

m == libm.so

Заголовок к имени библиотеки не имеет никакого отношения. Нет, конечно общий смысл в нашем случае - math...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #11 : 12-04-2008 10:13 » 

Хорошо, тогда, как узнать, какую библиотеку необходимо линковать?
Для меня, пока все заголовочные файлы - равны...
Выходит, для stdio.h ничего ненадо, а для math.h очень нужно.. Как тут поступать?

Ещё, хотел узнать, можно ли декомпилировать исходник обратно в исходный код? (в человеческий формат)
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 12-04-2008 10:22 » 

Maksir, просто надо принимать во внимание то, к какой библиотеке относится тот или иной заголовочный файл. Проще всего - посмотреть man, как тебе RXL продемонстрировал. По функции или по заголовку.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 12-04-2008 11:32 » 

Maksir, есть run-time библиотеки, которые линкуются по умолчанию.Туда и входит стандартная библиотека С.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Maksir
Постоялец

ru
Offline Offline

« Ответ #14 : 17-04-2008 12:46 » 

RXL, стандартная библиотека С, это, например, если я пишу заголовочный файл stdio.h то автоматически компилятор линкует туда нужные библиотеки для форматирования/вывода текста. Так?

Мне, просто непонятно, почему он (компилятор) не поступает также со всеми остальными.

Maksir, просто надо принимать во внимание то, к какой библиотеке относится тот или иной заголовочный файл.
А я думал, что наоборот... От загаловка система сама могла бы включить нужные ей для этого библиотеки. Поскольку, какой заголовок пишу я, - я то понимаю, зачем его пишу. Получается, что непонимает меня система... (а чегось это у тебя тут за заголовочный файл такой? типа, деНги посчитать вздумал на сберкнижке? =)))
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 17-04-2008 12:55 » 

Заголовочные файлы обычно содержат только объявления типов, функций и т.п. (библиотеки типа STL не в счёт - ну так и линковать для них ничего не надо Улыбаюсь ) Где эти функции определены, компилятору неизвестно - ему важно лишь, что они объявлены - поэтому при компиляции файла ошибки "неизвестный идентификатор" не будет.

Линковщик просто связывает объявление с определением, поэтому ему тоже всё равно, где у тебя определены объявленные функции - лишь бы все были объявлены по одному разу, чтобы не было "undefined" и "redefinition". Совсем не дело линковщика разбираться, в библиотеке ли функция определена, из соседнего объектного файла, собранного тобой же 2 секунды назад, или ещё откуда.
Кто тебя знает, откуда ты включил хедер math.h - может, ты переопределил все пути для поиска инклудов и используешь свой заголовок с таким же именем. В конце концов, заголовок же просто препроцессор припишет в точку включения, и всё.
« Последнее редактирование: 17-04-2008 12:59 от Вад » Записан
Maksir
Постоялец

ru
Offline Offline

« Ответ #16 : 18-04-2008 09:49 » 

Вад, спасибо!
Если вам нетрудно, скажите, где эти библиотеки обычно хранятся, и можно ли посмотреть их исходный код?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 18-04-2008 10:18 » 

Сами собранные библиотеки - в /usr/lib, /usr/local/lib
Исходный код нужно, насколько понимаю, отдельно добывать Улыбаюсь По крайней мере, когда мне случалось руками обновлять одну библиотеку для специфической железки, качал исходники и собирал с помощью кросс-компилятора. Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines