如何使用 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 的所有标准定义。
我正在使用带有 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 的所有标准定义。