gbadev.org forum archive

This is a read-only mirror of the content originally found on forum.gbadev.org (now offline), salvaged from Wayback machine copies. A new forum can be found here.

DS development > Heeelp!!! -lm doesn't work

#159274 - Optimus - Sat Jun 28, 2008 4:13 pm

There is a crazy problem I can't find what's the problem.

Simply I get the message "undefined reference to `sin'" but I have -lm in my makefile and I still get the same message..

..and by searching in your forum for people with the similar problem, their problem was solved by inserting -lm into their makefile. But only here when I do this, I still get the same problem :(

I even searched a lot of other crazy things, like changing the -L$ dir to some eabi dir and other subdirs. But I also get "undefined reference to __aeabi_idiv" if I do this. But I don't need to do this and the sin problem is still there.

I have installed the latest DevkitPro. I haven't made my makefile, I just downloaded from a site with NDS coding tutorials. I don't know much of what's going in on a makefile :P

In the main code I just #include <math.h> and then just use sin()
Ok here is the makefile:

Code:

#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif

include $(DEVKITARM)/ds_rules

#---------------------------------------------------------------------------------
# BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files
# DATA is a list of directories containing binary files
# all directories are relative to this makefile
#---------------------------------------------------------------------------------
BUILD      :=   build
SOURCES      :=   source 
INCLUDES   :=   include
DATA      :=

#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------
ARCH   :=   -mthumb -mthumb-interwork

CFLAGS   :=   -g -Wall -O3\
          -march=armv5te -mtune=arm946e-s -fomit-frame-pointer\
         $(ARCH)

CFLAGS   +=   $(INCLUDE) -DARM9
CXXFLAGS   :=   $(CFLAGS) -fno-rtti -fno-exceptions

ASFLAGS   :=   -g $(ARCH) -march=armv5te -mtune=arm946e-s

LDFLAGS   =   -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) \
         -lm

#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS   := -lnds9
 
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
LIBDIRS   :=   $(LIBNDS)
 
#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
# rules for different file extensions
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
 
export ARM9BIN   :=   $(TOPDIR)/$(TARGET).arm9
export ARM9ELF   :=   $(CURDIR)/$(TARGET).arm9.elf
export DEPSDIR := $(CURDIR)/$(BUILD)

export VPATH   :=   $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
               $(foreach dir,$(DATA),$(CURDIR)/$(dir))
 
CFILES      :=   $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES   :=   $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
SFILES      :=   $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
BINFILES   :=   $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
 
#---------------------------------------------------------------------------------
# use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------
ifeq ($(strip $(CPPFILES)),)
#---------------------------------------------------------------------------------
   export LD   :=   $(CC)
#---------------------------------------------------------------------------------
else
#---------------------------------------------------------------------------------
   export LD   :=   $(CXX)
#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------

export OFILES   :=   $(addsuffix .o,$(BINFILES)) \
               $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
 
export INCLUDE   :=   $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
         $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
         -I$(CURDIR)/$(BUILD)
 
export LIBPATHS   :=   $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
 
.PHONY: $(BUILD) clean
 
#---------------------------------------------------------------------------------
$(BUILD):
   @[ -d $@ ] || mkdir -p $@
   @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
 
#---------------------------------------------------------------------------------
clean:
   @echo clean ...
   @rm -fr $(BUILD) *.elf *.nds* *.bin
 
 
#---------------------------------------------------------------------------------
else
 
DEPENDS   :=   $(OFILES:.o=.d)
 
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
$(ARM9BIN)   :   $(ARM9ELF)
   @$(OBJCOPY) -O binary $< $@
   @echo built ... $(notdir $@)

$(ARM9ELF)   :   $(OFILES)
   @echo linking $(notdir $@)
   @$(LD)  $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@

#---------------------------------------------------------------------------------
# you need a rule like this for each extension you use as binary data
#---------------------------------------------------------------------------------
%.bin.o   :   %.bin
#---------------------------------------------------------------------------------
   @echo $(notdir $<)
   @$(bin2o)


-include $(DEPENDS)
 
#---------------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------


It is for ARM9, there is also the ARM7 makefile inside which is similar but I won't paste this here too because it's already too big, except if you ask me to.

HELP!!!

(This problem is driving me crazy! Shouldn't by default basic math function work, in a devkitpro I installed and ready makefile, where I didn't touched anything? Even with -lm and #include <math.h> they still don't?)
_________________
Kode or Die!

#159278 - tepples - Sat Jun 28, 2008 5:32 pm

The math library (<math.h>, -lm) implements various functions in floating-point arithmetic, using the 'float' and 'double' data types. But because the DS has no dedicated hardware to handle 'float' or 'double', any program that uses them has to implement operations on these types using a comparatively slow software library. This means floating-point arithmetic won't scale to large numbers of objects without a significant drop in frame rate. A lot of games use fixed-point arithmetic to work around this deficiency. So while you wait for someone to answer your specific question about libm.a in devkitARM, you could look through Wikipedia's article about fixed-point arithmetic.

Another thing you could try: Try putting -lm at the end of LIBS, right after -lnds9, not in LDFLAGS.
_________________
-- Where is he?
-- Who?
-- You know, the human.
-- I think he moved to Tilwick.

#159351 - Optimus - Sun Jun 29, 2008 6:11 pm

Quote:
Another thing you could try: Try putting -lm at the end of LIBS, right after -lnds9, not in LDFLAGS.


Thanks! That was it :P
Ugh.. I can feel stupid now. But I can continue coding at least ;)[/quote]
_________________
Kode or Die!

#159370 - kusma - Sun Jun 29, 2008 9:00 pm

Oh man, don't tell me you're going to spam the scene with NDS plasmas now, Opti... :P

#159380 - SiW - Sun Jun 29, 2008 10:54 pm

haha, I just made the Optimus connection too :)

#159414 - 0xtob - Mon Jun 30, 2008 1:52 pm

Check out trig_lut.h in libnds which has lookup-tables for sin and cos. On the NDS, avoid floating point like the pest! Also avoid division and sqrt (there are special hardware functions for this).

Now give us that Led Blur NDS port :)
_________________
http://blog.dev-scene.com/0xtob | http://nitrotracker.tobw.net | http://dsmi.tobw.net