Неопределенная ссылка на posix_memalign в ARM GCC

Я использую (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 Ошибка выглядит так:

Неопределенная ссылка на posix_memalign в ARM GCC

В моем файле 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".

Нет, это вообще не дубликат. Я знаю, что вы можете вызвать target_link_libraries () и таким образом добавить флаги в компоновщик, но это не обязательно. Но я не пытаюсь решить эту проблему.

user45189 05.12.2018 11:36

Это может быть проблема с упорядочиванием библиотек в командной строке вызова компоновщика. Если вы знаете, что CMAKE_C_FLAGS не подходит для библиотек ссылок, то почему вы используете его в своем коде и показываете нам этот код?

Tsyvarev 05.12.2018 13:21

Могу я спросить, почему я получил отрицательные голоса на свой вопрос. Я знаю, что это конкретный и вроде бы непонятный вопрос, но все же почему?

user45189 05.12.2018 13:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
1 696
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

На официальном сайте 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.

Другие вопросы по теме