Я использую (STM32F407VG-Discovey board) с компилятором «gcc-arm-none-eabi-7-2017-q4-major» (arm-none-eabi-gcc) и пытаюсь реализовать «плоские буферы проекта Google». Это необходимо для работы библиотеки времени malloc.h, а также для кучи памяти.
Я включаю кучу памяти на своем процессоре ARM, тестирую ее с помощью include и пробую базовую операцию, вызывающую функцию malloc. Все нормально работает.
Теперь я включаю файлы заголовков google flatbuffers и получаю сообщение об ошибке «неопределенная ссылка на` posix_memalign '». Мой компоновщик не может найти эту функцию. Не находит, но уже должен быть posix_memalign в stdlib.h Ошибка выглядит так:
В моем файле CMake я установил свои флаги на
SET(CMAKE_C_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wall -std=gnu11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize -lc -lrdimon" CACHE INTERNAL "c compiler flags")
Также я понял, что если я не использую флаг -lc и -lrdimo, будет неопределенная ссылка на _write (), _read (), _sbrk, _exit .....
Объяснение, почему это не дублируется: я знаю, что добавляю библиотеку компоновщика с CMake, вы выполняете команду target_link_libraries (). Проблема здесь в том, что по нетривиальной причине мой лайнер не найдет функцию posix_memalign. Но он найдет другие функции, такие как malloc, alloc, free, ... Все они находятся в "stdlib.h".
Это может быть проблема с упорядочиванием библиотек в командной строке вызова компоновщика. Если вы знаете, что CMAKE_C_FLAGS не подходит для библиотек ссылок, то почему вы используете его в своем коде и показываете нам этот код?
Могу я спросить, почему я получил отрицательные голоса на свой вопрос. Я знаю, что это конкретный и вроде бы непонятный вопрос, но все же почему?





На официальном сайте ARM ToolChain в разделе 6.5.5. Выравнивание хранилища C heap сказано, что для использования функции posix_memalign вы должны использовать стандартный C99, а не C11, как я установил.
Итак, вы должны добавлять в своем CMAKE_C_FLAGS этот флаг: -std = c99
Если вы установили флаг -std = c11, вы должны его удалить.
Попробуй использовать
#include <malloc.h>
void* p;
p = memalign(alignment, size);
вместо
posix_memalign(&p, alignment, size);
См. Также этот ссылка на сайт
Использование -std = c99 не было жизнеспособным решением для нашей команды, потому что у нас есть код C11.
Лучшее решение - заставить flatcc использовать универсальные выровненные функции выделения, предоставляемые flatcc, вместо posix.
В процессе сборки убедитесь, что -DFLATCC_USE_GENERIC_ALIGNED_ALLOC передан в вашу командную строку компиляции, чтобы активировать эти общие версии.
Определение FLATCC_USE_GENERIC_ALIGNED_ALLOC активирует общие реализации выровненных распределений в включить / flatcc / flatcc_alloc.c.
Нет, это вообще не дубликат. Я знаю, что вы можете вызвать target_link_libraries () и таким образом добавить флаги в компоновщик, но это не обязательно. Но я не пытаюсь решить эту проблему.