Hi,
I'm having trouble to compile your code with my Makefile, it's working fine with the Arduino IDE but not with my command line Makefile, I'm unable to find out why and would like little help.
Here's the error message I got
/usr/bin/avr-gcc -Os -lm -lgcc -Wl,--gc-sections -mmcu=atmega1280 -o applet/test.elf applet/test.o applet/core.a
/usr/lib/gcc/avr/4.3.5/../../../avr/lib/avr51/libc.a(cmpsf2.o):../../../libm/fplib/cmpsf2.S:58: multiple definition of `__ltsf2'
/usr/lib/gcc/avr/4.3.5/avr51/libgcc.a(_lt_sf.o):(.text+0x0): first defined here
make: *** [applet/test.elf] Error 1
And here is my Makefile
# $Id$
TARGET = $(notdir $(CURDIR))
INSTALL_DIR = $(HOME)/Desktop/arduino-0018
PORT = /dev/ttyUSB0
UPLOAD_RATE = 57600
#UPLOAD_RATE = 19200
AVRDUDE_PROGRAMMER = stk500v1
#MCU = atmega328p
#MCU = atmega168
MCU = atmega1280
F_CPU = 16000000
############################################################################
# Below here nothing should be changed...
VERSION=18
ARDUINO = $(INSTALL_DIR)/hardware/arduino/cores/arduino
#AVR_TOOLS_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
AVR_TOOLS_PATH = /usr/bin
AVRDUDE_PATH = $(INSTALL_DIR)/hardware/tools
C_MODULES = \
$(ARDUINO)/wiring_pulse.c \
$(ARDUINO)/wiring_analog.c \
$(ARDUINO)/pins_arduino.c \
$(ARDUINO)/wiring.c \
$(ARDUINO)/wiring_digital.c \
$(ARDUINO)/WInterrupts.c \
$(ARDUINO)/wiring_shift.c \
$(INSTALL_DIR)/libraries/Wire/utility/twi.c \
$(INSTALL_DIR)/libraries/etherShield/ip_arp_udp_tcp.c \
$(INSTALL_DIR)/libraries/etherShield/enc28j60.c
# end of C_MODULES
CXX_MODULES = \
$(ARDUINO)/main.cpp \
$(ARDUINO)/WMath.cpp \
$(ARDUINO)/Print.cpp \
$(ARDUINO)/HardwareSerial.cpp \
$(INSTALL_DIR)/libraries/OneWire/OneWire.cpp \
$(INSTALL_DIR)/libraries/Wire/Wire.cpp \
$(INSTALL_DIR)/libraries/EEPROM/EEPROM.cpp \
$(INSTALL_DIR)/libraries/LiquidCrystal/LiquidCrystal.cpp \
$(INSTALL_DIR)/libraries/Spi/Spi.cpp \
$(INSTALL_DIR)/libraries/Mirf/mirf.cpp \
$(INSTALL_DIR)/libraries/Time/Time.cpp \
$(INSTALL_DIR)/libraries/TimeAlarms/TimeAlarms.cpp \
$(INSTALL_DIR)/libraries/DS1307RTC/DS1307RTC.cpp \
$(INSTALL_DIR)/libraries/Tone/Tone.cpp \
$(INSTALL_DIR)/libraries/etherShield/etherShield.cpp \
$(INSTALL_DIR)/libraries/Messenger/Messenger.cpp \
# end of CXX_MODULES
CXX_APP = applet/$(TARGET).cpp
MODULES = $(C_MODULES) $(CXX_MODULES)
SRC = $(C_MODULES)
CXXSRC = $(CXX_MODULES) $(CXX_APP)
FORMAT = ihex
# Name of this Makefile (used for "make depend").
MAKEFILE = Makefile
# Debugging format.
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
#DEBUG = stabs
DEBUG =
OPT = s
# Place -D or -U options here
CDEFS = -DF_CPU=$(F_CPU)L -DARDUINO=$(VERSION)
CXXDEFS = -DF_CPU=$(F_CPU)L -DARDUINO=$(VERSION)
# Place -I options here
CINCS = -I$(ARDUINO) -I$(INSTALL_DIR)/libraries/Wire -I$(INSTALL_DIR)/libraries/Wire/utility -I$(INSTALL_DIR)/libraries/OneWire -I$(INSTALL_DIR)/libraries/DS1307 -I$(INSTALL_DIR)/libraries/EEPROM -I$(INSTALL_DIR)/libraries/LiquidCrystal -I$(INSTALL_DIR)/libraries/Spi -I$(INSTALL_DIR)/libraries/Mirf -I../ -I$(INSTALL_DIR)/libraries/Time -I$(INSTALL_DIR)/libraries/DS1307RTC -I$(INSTALL_DIR)/libraries/TimeAlarms -I$(INSTALL_DIR)/libraries/Tone -I$(INSTALL_DIR)/libraries/etherShield -I$(INSTALL_DIR)/libraries/Messenger
CXXINCS = -I$(ARDUINO)
# Compiler flag to set the C Standard level.
# c89 - "ANSI" C
# gnu89 - c89 plus GCC extensions
# c99 - ISO C99 standard (not yet fully implemented)
# gnu99 - c99 plus GCC extensions
#CSTANDARD = -std=gnu99
CDEBUG = -g$(DEBUG)
#CWARN = -Wall -Wstrict-prototypes
#CWARN = -Wall # show all warnings
CWARN = -w # suppress all warnings
####CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CTUNING = -ffunction-sections -fdata-sections
CXXTUNING = -fno-exceptions -ffunction-sections -fdata-sections
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
CFLAGS = $(CDEBUG) -O$(OPT) $(CWARN) $(CTUNING) $(CDEFS) $(CINCS) $(CSTANDARD) $(CEXTRA)
CXXFLAGS = $(CDEBUG) -O$(OPT) $(CWARN) $(CXXTUNING) $(CDEFS) $(CINCS)
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
LDFLAGS = -O$(OPT) -lm -lgcc -Wl,--gc-sections
# Programming support using avrdude. Settings and variables.
AVRDUDE_PORT = $(PORT)
AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex
#AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf \
AVRDUDE_FLAGS = -V -F -C $(INSTALL_DIR)/hardware/tools/avrdude.conf \
-p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
-b $(UPLOAD_RATE)
# Program settings
CC = $(AVR_TOOLS_PATH)/avr-gcc
CXX = $(AVR_TOOLS_PATH)/avr-g++
LD = $(AVR_TOOLS_PATH)/avr-gcc
OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
AR = $(AVR_TOOLS_PATH)/avr-ar
SIZE = $(AVR_TOOLS_PATH)/avr-size
NM = $(AVR_TOOLS_PATH)/avr-nm
AVRDUDE = $(AVRDUDE_PATH)/avrdude
REMOVE = rm -f
MV = mv -f
# Define all object files.
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
OBJ_MODULES = $(C_MODULES:.c=.o) $(CXX_MODULES:.cpp=.o)
# Define all listing files.
LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = $(CFLAGS) -mmcu=$(MCU)
ALL_CXXFLAGS = $(CXXFLAGS) -mmcu=$(MCU)
ALL_ASFLAGS = -x assembler-with-cpp $(ASFLAGS) -mmcu=$(MCU)
ALL_LDFLAGS = $(LDFLAGS) -mmcu=$(MCU)
# Default target.
all: applet_files build sizeafter
build: elf hex
#applet_files: $(TARGET).pde
applet/$(TARGET).cpp: $(TARGET).pde
# Here is the "preprocessing".
# It creates a .cpp file based with the same name as the .pde file.
# On top of the new .cpp file comes the WProgram.h header.
# and prototypes for setup() and Loop()
# Then the .cpp file will be compiled. Errors during compile will
# refer to this new, automatically generated, file.
# Not the original .pde file you actually edit...
test -d applet || mkdir applet
echo '#include "WProgram.h"' > applet/$(TARGET).cpp
echo 'void setup();' >> applet/$(TARGET).cpp
echo 'void loop();' >> applet/$(TARGET).cpp
cat $(TARGET).pde >> applet/$(TARGET).cpp
elf: applet/$(TARGET).elf
hex: applet/$(TARGET).hex
eep: applet/$(TARGET).eep
lss: applet/$(TARGET).lss
sym: applet/$(TARGET).sym
# Program the device.
upload: applet/$(TARGET).hex
python ~/test.py $(PORT)
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex
ELFSIZE = $(SIZE) applet/$(TARGET).elf
sizebefore:
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi
sizeafter:
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
coff: applet/$(TARGET).elf
$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof
extcoff: $(TARGET).elf
$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof
.SUFFIXES: .elf .hex .eep .lss .sym
.elf.hex:
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
.elf.eep:
$(OBJCOPY) -O $(FORMAT) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--no-change-warnings \
--change-section-lma .eeprom=0 $< $@
# Create extended listing file from ELF output file.
.elf.lss:
$(OBJDUMP) -h -S $< > $@
# Create a symbol table from ELF output file.
.elf.sym:
$(NM) -n $< > $@
# Link: create ELF output file from library.
#applet/$(TARGET).elf: $(TARGET).pde applet/core.a
applet/$(TARGET).elf: applet/$(TARGET).o applet/core.a
$(LD) $(ALL_LDFLAGS) -o $@ applet/$(TARGET).o applet/core.a
applet/core.a: $(OBJ_MODULES)
@for i in $(OBJ_MODULES); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done
# Compile: create object files from C++ source files.
.cpp.o:
$(CXX) -c $(ALL_CXXFLAGS) $< -o $@
# Compile: create object files from C source files.
.c.o:
$(CC) -c $(ALL_CFLAGS) $< -o $@
# Compile: create assembler files from C source files.
.c.s:
$(CC) -S $(ALL_CFLAGS) $< -o $@
# Assemble: create object files from assembler source files.
.S.o:
$(CC) -c $(ALL_ASFLAGS) $< -o $@
# Automatic dependencies
%.d: %.c
$(CC) -lm -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
%.d: %.cpp
$(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
# Target: clean project.
clean:
$(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \
applet/$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss applet/core.a \
$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d)
.PHONY: all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter
#include $(SRC:.c=.d)
#include $(CXXSRC:.cpp=.d)
If anyone can help me it will be greatly appreciated because I'm always coding remotely in console and Arduino IDE is not an option for me.