Портирование системы сборки Visual Studio/VisualGDB на CMake/GCC
Я работал над переносом проекта из Visual Studio/VisualGDB, работающего на компьютере с Win10, в систему сборки CMake/GCC, работающую в Ubuntu 16.04. Полная сборка в конечном итоге будет работать на Cortex-M4.
В этом процессе я столкнулся с проблемой компоновщика, когда несколько ссылок в libc не определены
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
{...}/arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libg_nano.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'
Я использую следующие флаги:
CFLAGS:
-fdata-sections -ffunction-sections -std=gnu99 -mabi=aapcs -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
ASM_FLAGS:
-x assembler-with-cpp
LDFLAGS:
-static -Wl,--gc-sections -mabi=aapcs -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nano.specs -lc -lnosys
Эти флаги взяты из оригинальной сборки VisualGDB, которые собираются без каких-либо проблем.
Я обнаружил, что при использовании --specs=nosys.specs
вместо nano.specs
сборка завершается, но при работе на цели, где-то внутри возникает серьезная ошибка __libc_init_array()
,
Я подозреваю, что это связано с разницей между nano.specs
а также nosys.specs
Однако я не могу проверить это из-за проблем компоновщика, упомянутых выше. Я попробовал комбинацию <...> --specs=nono.specs --specs=nosys.specs -lc -lnosys
без удачи.
Кто-нибудь знает, почему это работает с VisualGDB, а не с CMake/GCC? Насколько я понимаю, VisualGDB все еще использует arm-none-eabi? Это, конечно, тот же набор инструментов, который я использую (проверенные версии 4.9.3 и 6.3.1)