Ошибка при линковке
Ошибка при линковке
Хм, значит решил я написать программу в С++ (учу его) и вот собственно в чем дело, написана программа котороя использует функцию 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
Кто виноват и что делать ?
/tmp/ccxfz7cU.o: In function `main':
/tmp/ccxfz7cU.o(.text+0x17d): undefined reference to `trunc'
collect2: ld returned 1 exit status
Кто виноват и что делать ?
Хм, ну вот вам коТ :
#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
#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
( www.cplusplus.com/ref/cmath - для референса). А по поводу что делать, floor и ceil тебе помогут.
SimpleMan
Хм,а в "Справочник программиста по С/С++" by Герберт Шилдт, написанно что есть (правда для редакции языка С99), так что, получается что gcc 3.2 не отвечает стандарту С99 ? И почему тогда скомпилилось (т.е. прошло проверку на синтаксис и всякие там объявления) ? Получается , что все таки объявление в math.h есть ?
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
Почитай тут и
http://gcc.gnu.org/onlinedocs/gcc-3.3/g ... %20Options
тут.
SimpleMan
Почитай тут и
http://gcc.gnu.org/onlinedocs/gcc-3.3/g ... %20Options
тут.
SimpleMan
Мда, насколько я понял вышеприведенную документацию (в меру воей развитости и знаний английского) можно было идти 2-мя путями :
1) при компиляции указать опцию -std=c99
2)использовать функцию round как встроенную, т.е. пишем вместо round __builtin_round и радуемся жизни.
Однако ничего из вышеприведенного не помогло
Кстати floor и ceil по идее описаны в cmath.h, однако у меня такого хидера и в помине нету, и поэтому они видимо описаны в math.h (если его подключать и опять же проверять только на синтаксис и объявления то все прокатывает). На мой взгляд проблема не в gcc , а в ld, т.к. (насколько я понимаю) gcc только проверяет синтаксис и ассемблирует, а потом линкер все это дело упаковывает в исполняемый файл, а проблема (вроде) возникает на стадии линковки.
1) при компиляции указать опцию -std=c99
2)использовать функцию round как встроенную, т.е. пишем вместо round __builtin_round и радуемся жизни.
Однако ничего из вышеприведенного не помогло
Кстати floor и ceil по идее описаны в cmath.h, однако у меня такого хидера и в помине нету, и поэтому они видимо описаны в math.h (если его подключать и опять же проверять только на синтаксис и объявления то все прокатывает). На мой взгляд проблема не в gcc , а в ld, т.к. (насколько я понимаю) gcc только проверяет синтаксис и ассемблирует, а потом линкер все это дело упаковывает в исполняемый файл, а проблема (вроде) возникает на стадии линковки.