Ошибка при линковке

Форум предназначен для новичков. В нем предполагается рассматривать вопросы, которые встают на первых этапах освоения Linux
Prosto_Kot

Ошибка при линковке

Сообщение Prosto_Kot »

Хм, значит решил я написать программу в С++ (учу его) и вот собственно в чем дело, написана программа котороя использует функцию trunc (или round или lround , мне не не принципиально), котороя находится в math.h, ну собственно я его подключаю и при линковке (т.е. программа скомпилированна и сасемблированна (gcc -c) ) вылазит следующее :

/tmp/ccxfz7cU.o: In function `main':
/tmp/ccxfz7cU.o(.text+0x17d): undefined reference to `trunc'
collect2: ld returned 1 exit status

Кто виноват и что делать ?

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

А где код?
Опыт растет прямо пропорционально выведенному из строя оборудованию

Prosto_Kot

Сообщение Prosto_Kot »

Хм, ну вот вам коТ :


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

int main(){

long int a[10][10];
int x,y,max,i;

i=0;

for(x=0;x<10;x++) {
for(y=0;y<10;y++) {
i++;
a[y][x]=i;}}

for(x=0;x<10;x++) {
printf("\n");
for(y=0;y<10;y++) {
printf("%-3d ",a[y][x]);
}}
printf("\n");

for(x=0;x<10;x++) {
for(y=0;y<10;y++) {
if ( trunc (a[y][x]/2) == (a[y][x]/2)) { a[y][x]=1; }
else { a[x][y]=0; }}}

return 0;
}

Mandrake 9.0, gcc 3.2 , ядро 2.4.19

Простой

Сообщение Простой »

"Виновата" C standard Library. Такой функции как trunc в math.h нет (Зато есть iso::trunc но она с другой оперы).
( www.cplusplus.com/ref/cmath - для референса). А по поводу что делать, floor и ceil тебе помогут.
SimpleMan

Гость

Сообщение Гость »

Извиняйте, вместо iso:: должно быть ios::
SimpleMan

Prosto_Kot

Сообщение Prosto_Kot »

Хм,а в "Справочник программиста по С/С++" by Герберт Шилдт, написанно что есть (правда для редакции языка С99), так что, получается что gcc 3.2 не отвечает стандарту С99 ? И почему тогда скомпилилось (т.е. прошло проверку на синтаксис и всякие там объявления) ? Получается , что все таки объявление в math.h есть ?


Prosto_Kot

Сообщение Prosto_Kot »

Ага, ясно, большое спасибо :)

Prosto_Kot

Сообщение Prosto_Kot »

Мда, насколько я понял вышеприведенную документацию (в меру воей развитости и знаний английского) можно было идти 2-мя путями :
1) при компиляции указать опцию -std=c99
2)использовать функцию round как встроенную, т.е. пишем вместо round __builtin_round и радуемся жизни.
Однако ничего из вышеприведенного не помогло :(
Кстати floor и ceil по идее описаны в cmath.h, однако у меня такого хидера и в помине нету, и поэтому они видимо описаны в math.h (если его подключать и опять же проверять только на синтаксис и объявления то все прокатывает). На мой взгляд проблема не в gcc , а в ld, т.к. (насколько я понимаю) gcc только проверяет синтаксис и ассемблирует, а потом линкер все это дело упаковывает в исполняемый файл, а проблема (вроде) возникает на стадии линковки.

Prosto_Kot

Сообщение Prosto_Kot »

Хе, проблема решилась, я не знал, что надо подключать библиотеку libm, пошел читать маны :)

Ответить