#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, которые ваш проект использует для конкретного процессора.