GCC: включить функцию math.h в программное обеспечение без операционной системы на ARM (arm-none-eabi-gcc)
Я работаю над автономным программным обеспечением на STM32H753. Я не использую ни libc, ни crt.
Вот командная строка ссылки:
arm-none-eabi-gcc -T"xxx.ld" -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,--start-group -lc -lm -Wl,--end-group -Wl,-Map=xxx.map -o xxx.elf <list of .o>
Теперь мне нужно включить математическую библиотеку, поскольку я использую
sqrt
функция. Я думал, что командной строки ссылки будет достаточно, но я получаю ошибку «sqrt undefined».
Я пытался добавить путь к
libm.a
: (также пробовал без
-Wl
)
arm-none-eabi-gcc -T"xxx.ld" -Wl,-L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/ -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,--start-group -lc -lm -Wl,--end-group -Wl,-Map=build_uP1/base_gen_uP1.map -o build_uP1/base_gen_uP1.elf <list of .o>
Но я все равно получаю ту же ошибку.
Я не понимаю, какие варианты выбрать для связывания с правильной библиотекой
1 ответ
Извините за этот ответ, но я думаю, что нашел решение.
- моя первая ошибка в том, что библиотеку нужно ставить в конец командной строки. порядок аргументов имеет значение.
- то есть много версий
libm.a
в установке gcc, поэтому мне пришлось выбрать правильный
Следующая строка работает:
arm-none-eabi-gcc -T"xxx.ld" -L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/thumb/v7+fp/hard/ -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,-Map=xxx.map -o xxx.elf <list of .o> -lm -lc
Я заметил, что один символ и некоторые данные из
libc.a
необходимы:
__errno
, а также
impure_data