如何使用 cmake 在 clang 中为 ARM 交叉编译器指定 stdlib 路径?

How to specify stdlib path for ARM cross compiler in clang with cmake?

我正在使用带有 clang 的 cmake 为 ARM cortex-m4 MCU(armv7e-m、softfp)编译 C 项目。

目前我正在使用 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.

但是,我想使用其他路径的标准库,对于这种情况:

/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 添加到编译器标志并手动包含来自 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 先在另一个路径中查找的最佳方法。

Tsyvarev 的评论成功了。我将以下内容添加到我的工具链 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 因为库名称与标准命名相同。万一你想添加你自己的不同名称的标准库,你只需添加 -nostdlib 标志,然后由你来提供你的项目用于特定 cpu 的所有标准定义。