Страница 1 из 1

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

Добавлено: 23 июл 2003, 11:17
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

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

Добавлено: 23 июл 2003, 11:32
Llama
А где код?

Добавлено: 23 июл 2003, 15:30
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

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

Добавлено: 23 июл 2003, 17:03
Гость
Извиняйте, вместо iso:: должно быть ios::
SimpleMan

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

Добавлено: 23 июл 2003, 19:59
Гость

Добавлено: 23 июл 2003, 20:59
Prosto_Kot
Ага, ясно, большое спасибо :)

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

Добавлено: 24 июл 2003, 10:49
Prosto_Kot
Хе, проблема решилась, я не знал, что надо подключать библиотеку libm, пошел читать маны :)