【发布时间】: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 首先查看另一条路径的最佳方法。
【问题讨论】:
-
您可以尝试设置变量CMAKE_<LANG>_STANDARD_LIBRARIES 和CMAKE_<LANG>_STANDARD_INCLUDE_DIRECTORIES,如bugreport 中所述。不确定这是否正确或最好的方法,但它可以工作。
-
顺便提一下,我想提一下github.com/dockcross/dockcross,我喜欢用它来进行交叉编译(它提供带有工具链的docker镜像)。