Я только что перенес проект микроконтроллера STM32 из Keil uVision (используя Keil ARM Compiler) в CooCox CoIDE (используя GCC ARM Embedded compiler).
Проблема в том, что размер кода — это двойной размер при компиляции в CoIDE с GCC по сравнению с Keil uVision.
Как это может быть? Что я могу сделать?
Размер кода в Keil: 54632b (.text)
Размер кода в CoIDE: 100844b (.text)
Флаги компилятора GCC:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -g2 -Wl,-Map=project.map -Os
-Wl,--gc-sections -Wl,-TC:\arm-gcc-link.ld -g -o project.elf -L -lm
Я подозреваю, что CoIDE и GCC скомпилируют множество функций и файлов, которые присутствуют в проекте, но не используются (пока). Возможно ли, что он компилирует целые файлы, даже если я использую там только 1 функцию из 20? (хотя у меня есть -О)
Трудно сказать, какие файлы действительно скомпилированы / связаны в вашем конечном двоичном файле из информации, которую вы предоставляете. Я предполагаю, что он берет все файлы C, которые он находит в вашем проекте, если вы не указали явно, какой из них нужно скомпилировать, или если вы не используете свой собственный Makefile.
Но из опций компилятора, которые вы даете, флаг компоновщика --gc-sections
не будет много мусора, если у вас нет следующих флагов компилятора: -ffunction-sections -fdata-sections
, Попробуйте добавить эти параметры, чтобы удалить все неиспользуемые функции и данные во время соединения.
Поскольку вопрос был помечен C ++, мне интересно, хотите ли вы отключить исключения и RTTI. Те занимают совсем немного кода. добавлять -fno-exceptions -fno-rtti
на флаги компоновщика.