undefined reference to `log' - obwohl #include<math.h>

Gast #1552916
Lesenswert?
• ▲
▼
Hallo zusammen,

gleich vornweg - ich bin newbee im Bereich ARM und arbeite mich gerade 
ein mit Hilfe des Buch "C Programming for Embedded Microcontrollers".
Ich nutze das Olimex-DevBoard At91SAM7x256 mit Eclipse und 
Yagarto-Toolchain.
Bisher war alles lösbar.

Nun wollte ich die "log"-Funktion nutzen. Trotz einbinden der math.h 
folgt beim Kompilieren folgende Fehlermeldung
1
**** Build of configuration Default for project Tempsense ****
2

3
make all 
4
arm-elf-gcc -c -g -mcpu=arm7tdmi -O0 -Wall -I./Drivers -DAT91SAM7X256 Code/main.c -o main.o
5
arm-elf-gcc -nostartfiles -Wl,-Map,out.map,--cref -T Startup/RAM.ld  -n -o tempsens.elf startup.o main.o syscalls.o dbgu.o
6
main.o: In function `CHECK_TEMPERATUR':
7
E:\ARM_C\_Ram-Prog\Tempsens/Code/main.c:74: undefined reference to `log'
8
collect2: ld returned 1 exit status
9
make: *** [sram] Error 1

Warum???
1
#include <stdio.h>
2
#include <math.h>
3
#include "at91sam7x.h"
4
#include "dbgu.h"
5

6
void CHECK_TEMPERATUR(void);
7
void INIT_ADC(void);
8
void Delay(void);
9
void INIT_LCD(void);
10

11
char my_str[40];
12

13
int main(void)
14
{
15
  DBGUInit(DBGU_115200);
16
  DBGUTxMsg(my_str);
17
  INIT_LCD();
18
  while (1)
19
  {
20
    Delay();
21
    CHECK_TEMPERATUR();
22
  }
23
}
24

25
void INIT_LCD(void)
26
{
27
...
28
}
29

30
void CHECK_TEMPERATUR(void)
31
{
32
    unsigned int ADC5, i;
33
    float Rtemp, Temp;
34
    INIT_ADC();
35
    ADC5=0;
36
    for(i=0;i<128;i++) //Mittelwertbildung - 128 Werte
37
    {
38
      ADC_CR = 0x00000002;        //Starten der Wandlung
39
      while(!(ADC_SR & 0x00000020));
40
      ADC5 += ADC_CDR5;
41
    }
42
    ADC5 /= 128;
43
    Rtemp = ( (1024-ADC5) * 1800 ) /ADC5;
44

45
    Temp = log(Rtemp/2595.2) / (-0.0431));
46

47
    sprintf(my_str,"\rAktuelle Temp = %f", Temp);
48
    DBGUTxMsg(my_str);
49
}
Gast #1552934
Lesenswert?
• ▲
▼
@Thomas: Das mit den Klammern ist durch säubern für hier enstanden.

@tpircher: Wo mache ich das?
Hier mein "makefile"
1
#----------------------------------------------------------------------------------
2
#   FILENAME:       Makefile
3
#
4
#   DESCRIPTION:    Makefile for compiling and linking the OSPLC Framework code
5
#
6
#----------------------------------------------------------------------------------
7

8
#----------------------------------------------------------------------------------
9
# TODO: Change the name of the output files for your project
10
#    (Replace "Framework" with your projects name)
11
#----------------------------------------------------------------------------------
12
OUTFILE_SRAM=tempsens
13

14
TARGET=AT91SAM7X256
15

16
INCL=./Drivers
17

18
# Paths to standard and maths library files - assumes default YAGARTO installation
19
LIBGCC=C:/Programme/yagarto/lib/gcc/arm-elf/4.4.2/libgcc.a
20
LIBC=C:/Programme/yagarto/arm-elf/lib/libc.a
21
LIBM=C:/Programme/yagarto/arm-elf/lib/libm.a
22
LIBA=C:/Programme/yagarto/arm-elf/lib/liba.a
23

24

25
# Optimisation settings
26
# optimisation for size
27
#OPTIM=-Os
28
# no optimisation - for debug mode
29
OPTIM=-O0
30

31
AS=arm-elf-gcc
32
CC=arm-elf-gcc
33
LD=arm-elf-gcc
34
OBJCOPY=arm-elf-objcopy
35
OBJDUMP=arm-elf-objdump
36
CCFLAGS=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(INCL) -D$(TARGET)
37
ASFLAGS=-D__ASSEMBLY__ -D$(TARGET) -g -mcpu=arm7tdmi -c $(OPTIM) -Wall -I$(INCL)
38

39
# Linker flags.
40
#  -Wl,... :    tell GCC to pass this to linker.
41
#  -Map    :    create map file
42
#  --cref  :    add cross reference to map file
43
LDFLAGS_R+=-nostartfiles -Wl,-Map,out.map,--cref
44
LDFLAGS_R+=-T Startup/RAM.ld
45

46

47
#----------------------------------------------------------------------------------
48
# TODO: Add all the object files generated for you project to the framework
49
#    objects listed below
50
#----------------------------------------------------------------------------------
51
OBJS=startup.o \
52
     main.o \
53
   syscalls.o \
54
   dbgu.o
55

56
rebuild: clean all
57

58
all: sram
59

60
sram: $(OBJS)
61
  $(LD) $(LDFLAGS_R)  -n -o $(OUTFILE_SRAM).elf $(OBJS)
62
  $(OBJCOPY) --strip-debug --strip-unneeded $(OUTFILE_SRAM).elf -O binary $(OUTFILE_SRAM).bin
63
  
64
#----------------------------------------------------------------------------------
65
# TODO: Add your object file compilation instructions
66
#----------------------------------------------------------------------------------
67

68
main.o: Code/main.c
69
  $(CC) -c $(CCFLAGS) Code/main.c -o main.o
70

71
startup.o:  Startup/startup.S
72
  $(AS) $(ASFLAGS) Startup/startup.S -o startup.o
73
  
74
dbgu.o: Drivers/dbgu.c
75
  $(CC) -c $(CCFLAGS) Drivers/dbgu.c -o dbgu.o
76
  
77
syscalls.o: syscalls.c 
78
  $(CC) -c $(CCFLAGS) syscalls.c -o syscalls.o 
79
  
80
clean:
81
  -rm *.o *.bin *.elf *.map
Gast #1552980
Lesenswert?
• ▲
▼
1
**** Build of configuration Default for project Tempsense ****
2

3
make all 
4
arm-elf-gcc -nostartfiles -Wl,-Map,out.map,--cref -T Startup/RAM.ld -lm  -n -o tempsens.elf startup.o main.o syscalls.o dbgu.o
5
main.o: In function `CHECK_TEMPERATUR':
6
E:\ARM_C\_Ram-Prog\Tempsens/Code/main.c:74: undefined reference to `log'
7
collect2: ld returned 1 exit status
8
make: *** [sram] Error 1
Gast #1552982
Lesenswert?
• ▲
▼
clean und danach build
1
**** Build of configuration Default for project Tempsense ****
2

3
make all 
4
arm-elf-gcc -D__ASSEMBLY__ -DAT91SAM7X256 -g -mcpu=arm7tdmi -c -O0 -Wall -I./Drivers Startup/startup.S -o startup.o
5
arm-elf-gcc -c -g -mcpu=arm7tdmi -O0 -Wall -I./Drivers -DAT91SAM7X256 Code/main.c -o main.o 
6
arm-elf-gcc -c -g -mcpu=arm7tdmi -O0 -Wall -I./Drivers -DAT91SAM7X256 syscalls.c -o syscalls.o 
7
arm-elf-gcc -c -g -mcpu=arm7tdmi -O0 -Wall -I./Drivers -DAT91SAM7X256 Drivers/dbgu.c -o dbgu.o
8
arm-elf-gcc -nostartfiles -Wl,-Map,out.map,--cref -T Startup/RAM.ld -lm  -n -o tempsens.elf startup.o main.o syscalls.o dbgu.o
9
main.o: In function `CHECK_TEMPERATUR':
10
E:\ARM_C\_Ram-Prog\Tempsens/Code/main.c:74: undefined reference to `log'
11
collect2: ld returned 1 exit status
12
make: *** [sram] Error 1
Gast #1553020
Lesenswert?
• ▲
▼
Ich habe etwas rausgefunden
funkioniert nicht: Temp = log(Rtemp);
funktioniert     : Temp = log(2.2);

d.h. steht ein Wert in der Klammer funktioniert es und wenn der 
Variablenname innerhalb der Klammer steht macht er mir das Problem beim 
Kompilieren
Gast #1553029
Lesenswert?
• ▲
▼
Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, 
Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, 
Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke, Danke


Ich habe da schon den ganzen Tag damit verbracht
Persönliche Seite #1553043
Lesenswert?
• ▲
▼
Dein Problem wurde schon von Stefan geloest, aber nur zur Information:

Daniel schrieb:
> funktioniert     : Temp = log(2.2);
> funkioniert nicht: Temp = log(Rtemp);

Du verwendest einen neuen GCC? Der erkennt, dass log(2.2) eine Konstante 
ist und ersetzt den Funktionsaufruf mit dem Ergebnis des Ausdrucks.

Das Ergebnis von log(Rtemp) ist zur Kompilationszeit nicht bekannt, und 
GCC muss die Funktion log() also aufrufen.

Im ersten Fall wird die log()-Funktion also nicht dazugelinkt, im 
zweiten Fall wird sie das. Deshalb hast du auch den Fehler nur bei der 
zweiten Variante bekommen.
Persönliche Seite #1553065
Lesenswert?
• ▲
▼
Mark Brandis schrieb:
> Huh, der Compiler rechnet Logarithmusfunktionen aus? Cool.

GCC kann das seit v4.3. Ein Auszug aus 
http://gcc.gnu.org/gcc-4.3/changes.html :

> The GCC middle-end has been integrated with the MPFR library. This allows
> GCC to evaluate and replace at compile-time calls to built-in math
> functions having constant arguments with their mathematically equivalent
> results. In making use of MPFR, GCC can generate correct results
> regardless of the math library implementation or floating point precision
> of the host platform. This also allows GCC to generate identical results
> regardless of whether one compiles in native or cross-compile
> configurations to a particular target. The following built-in functions
> take advantage of this new capability: acos, acosh, asin, asinh, atan2,
> atan, atanh, cbrt, cos, cosh, drem, erf, erfc, exp10, exp2, exp, expm1,
> fdim, fma, fmax, fmin, gamma_r, hypot, j0, j1, jn, lgamma_r, log10, log1p,
> log2, log, pow10, pow, remainder, remquo, sin, sincos, sinh, tan, tanh,
> tgamma, y0, y1 and yn. The float and long double variants of these
> functions (e.g. sinf and sinl) are also handled. The sqrt and cabs
> functions with constant arguments were already optimized in prior GCC
> releases. Now they also use MPFR.
Gast #3249548
Lesenswert?
• ▲
▼
DANKE! auch von mir. Der Witz ist nämlich, auf Linux ubuntu 
2.6.38-11-generic geht mein Aufruf
$ gcc -D_REENTRANT  -Wall -lm -lpcan -lpthread -o s2algo 
tools/sens2algos.c
ohne Probleme. Dagegen haut's mir den auf
Linux ubuntu 3.5.0-36-generic #57~precise1-Ubuntu SMP
um die Ohren. Ich habe's nicht verstanden. Mit
$ gcc -D_REENTRANT  -Wall -pthread -o s2algo tools/sens2algos.c -lm 
-lpcan
wurde ich glücklich.
Und ich habe ernsthaft 1.5 Tage recherchiert!!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.