6 years, 1 month ago.

Off-line ARM-GCC build of eCompass example fails

Off-line ARM-GCC build of eCompass example fails

I use Mbed-cli to import locally (includes eCompass_Lib_V3.ar file)

mbed import https://os.mbed.com/users/JimCarver/code/KL46_eCompass/ -v 

And use the online compiler export function the get the makefile (toolchain vscode_gcc_arm)

I build the program using GNU Tools ARM Embedded version 7 2017-q4-major and receive the following errors during linking

link error

link: KL46_eCompass.elf
eCompass_Lib/eCompass_Lib.o: In function `eCompass::eCompass()':
eCompass_Lib.cpp:(.text._ZN8eCompassC2Ev+0x4): undefined reference to `init_eCompass'
eCompass_Lib/eCompass_Lib.o: In function `eCompass::run(MotionSensorDataCounts&, MotionSensorDataCounts&)':
eCompass_Lib.cpp:(.text._ZN8eCompass3runER22MotionSensorDataCountsS1_+0xd2): undefined reference to `run_eCompass'
eCompass_Lib/eCompass_Lib.o: In function `eCompass::calibrate()':
eCompass_Lib.cpp:(.text._ZN8eCompass9calibrateEv+0x2): undefined reference to `calibrate_eCompass'
collect2.exe: error: ld returned 1 exit status
make[1]: *** [/cygdrive/e/Dvm/ARM/KL46_eCompass/Makefile:267: KL46_eCompass.elf] Error 1

makefile elf rule

265 	$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) $(PROJECT).link_script.ld 
266			+@echo "link: $(notdir $@)"
267			@$(LD) $(LD_FLAGS) -T $(filter-out %.o, $^) $(LIBRARY_PATHS) --output $@ $(filter %.o, $^) $(LIBRARIES) $(LD_SYS_LIBS)

Adding the .ar file to line 267

updated makefile

@$(LD) $(LD_FLAGS) -T $(filter-out %.o, $^) $(LIBRARY_PATHS) --output $@ $(filter %.o, $^) $(LIBRARIES) $(LD_SYS_LIBS) .././eCompass_Lib/eCompass_Lib_V3.ar

results in the following errors

link error

link: KL46_eCompass.elf
c:/.../arm-none-eabi/bin/ld.exe: error: .././eCompass_Lib/eCompass_Lib_V3.ar(sensor_algorithms.o): Conflicting CPU architectures 12/0
c:/.../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .././eCompass_Lib/eCompass_Lib_V3.ar(sensor_algorithms.o)
c:/.../arm-none-eabi/bin/ld.exe: error: .././eCompass_Lib/eCompass_Lib_V3.ar(magnetic.o): Conflicting CPU architectures 12/0
c:/.../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .././eCompass_Lib/eCompass_Lib_V3.ar(magnetic.o)
c:/.../arm-none-eabi/bin/ld.exe: error: .././eCompass_Lib/eCompass_Lib_V3.ar(matrix.o): Conflicting CPU architectures 12/0
c:/.../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .././eCompass_Lib/eCompass_Lib_V3.ar(matrix.o)
c:/.../arm-none-eabi/bin/ld.exe: error: .././eCompass_Lib/eCompass_Lib_V3.ar(orientation.o): Conflicting CPU architectures 12/0
c:/.../arm-none-eabi/bin/ld.exe: failed to merge target specific data of file .././eCompass_Lib/eCompass_Lib_V3.ar(orientation.o)
c:/.../arm-none-eabi/bin/ld.exe: Dwarf Error: Could not find abbrev number 10.

Am I going about this the wrong way or is the original eCompass_Lib_V3 library just not compatible with GCC because it was build using ARMCC?

1 Answer

6 years, 1 month ago.

Jun,

Why are you importing offline and then exporting from the online compiler? Why not just 'mbed import' and then 'mbed compile' or if you really want make files use 'mbed export' on the command line.

You are correc that the online compiler uses ARMCC, so you really cant mix and match. You can however use ARMCC locally, just like you can use IARCC or GCC with mbed CLI.

Accepted Answer