Как указать путь stdlib для компилятора ARM cross в clang с cmake?

#c #cmake #linker #arm #clang

Вопрос:

Я использую cmake с clang для компиляции проекта C для микроконтроллера ARM cortex-m4 (armv7e-m, softfp).

В настоящее время я использую набор инструментов GCC включает в себя и библиотеки, поэтому я указываю их следующим образом в файле cmake набора инструментов:

 set(CMAKE_SYSROOT /opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi)
 

Это работает, как и ожидалось, и с включениями нет никаких проблем. Поскольку компоновщику требуются стандартные библиотеки, я заметил, что он выглядит по умолчанию для libm и libc в

/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib .

Однако я хотел бы использовать библиотеки std с другого пути, для этого случая:

/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/thumb/v7e-m fp/softfp

Я попытался использовать -L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/thumb/v7e-m fp/softfp , но заметил, что другой путь имеет приоритет.

Поэтому мой вопрос в том, как я могу сказать clang, чтобы он искал стандартные библиотеки по этому пути? Мое текущее решение вообще не устанавливает CMAKE_SYSROOT, затем я добавляю -nostdinc флаги компилятора и включаю std includes из набора инструментов GCC вручную

 -I${ARM_TOOLCHAIN_PATH}/arm-none-eabi/include
-I${ARM_TOOLCHAIN_PATH}/lib/gcc/arm-none-eabi/10.2.1/include
 

Это позволяет мне указать компоновщику пути для библиотеки, которую я хочу:

 -L${ARM_TOOLCHAIN_PATH}/lib/thumb/v7e-m fp/softfp
 

Поскольку у меня нет опыта работы с clang и cmake, я не уверен, что это лучший способ переопределить путь к библиотеке или попросить clang сначала поискать другой путь.

Комментарии:

1. Вы можете попытаться установить переменные CMAKE_<LANG>_STANDARD_LIBRARIES<LANG> и CMAKE_<LANG>_STANDARD_INCLUDE_ДИРЕКТОРИИ<LANG> , как описано в этом багрепорте . Не уверен, правильно ли это или лучший способ, но это может просто сработать.

2. Просто в качестве примечания я хотел бы упомянуть github.com/dockcross/dockcross , который мне нравится для кросс-компиляции (он предоставляет изображения докеров, поставляемые с цепочками инструментов).

Ответ №1:

Комментарий Цыварева сработал. Я добавил следующее в свой файл cmake с набором инструментов

 set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES 
    ${ARM_TOOLCHAIN_BIN_DIR}/../arm-none-eabi/include
    )
 

После этого я указываю пути к библиотеке, где cmake должен искать libm libc.

 target_link_directories(${EXECUTABLE} PRIVATE
    ${PROJECT_SOURCE_DIR}/my_custom_libs
    )
 

Я не использовал CMAKE_C_STANDARD_LIBRARIES , так как имена библиотек совпадают со стандартными именами. На всякий случай, если вы хотите добавить свои собственные библиотеки std с разными именами, вам просто нужно добавить -nostdlib флаг, а затем предоставить все определения std, которые ваш проект использует для конкретного процессора.