【问题标题】:How to specify stdlib path for ARM cross compiler in clang with cmake?如何使用cmake在clang中为ARM交叉编译器指定stdlib路径?
【发布时间】:2021-03-20 16:21:32
【问题描述】:

我正在使用 cmake 和 clang 为 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.

但是,对于这种情况,我想使用其他路径中的 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 添加到编译器标志并手动包含来自 GCC 工具链的 std 包含

-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 首先查看另一条路径的最佳方法。

【问题讨论】:

标签: c cmake linker arm clang


【解决方案1】:

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 的所有标准定义。

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 2013-01-19
    • 1970-01-01
    • 2015-10-21
    • 2016-01-15
    • 2019-06-29
    • 2014-05-31
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多