【vscode】vscode+cmake+llvm+ninja开发环境的搭建(draft)

文章目录

  • 前言
  • 1 软件、工具和插件安装
    • 1.1 vscode安装
    • 1.2 cmake安装
    • 1.3 安装LLVM
    • 1.4 安装Ninja
    • 1.5 vscode插件安装
  • 2 工具链和CMakeLists
    • 2.1 工具链(toolchain.cmake)
    • 2.2 CMakeLists.txt
    • 2.3 基本语法注释


前言

本文是一个使用vscode的小白扫盲贴。
所谓工欲善其事必先利其器,作为码农的生产工具,vscode的开发配置是生产的第一步。


1 软件、工具和插件安装

本章内容主要参考下面这篇文章。
链接:vscode + cmake + ninja + ARMCC 配置stm32开发环境(构建篇)

以下做一些简单补充。

1.1 vscode安装

没啥好说的,官网下载,无脑安装。

1.2 cmake安装

参考上面链接文章,讲的很详细。

1.3 安装LLVM

链接: LLVM Release
链接: github 安装包
GitHub的跳转总是会抽,可以尝试用git clone下载。
本文提供下载好的文件,有需要自取。

LLVM 是一套编译器基础设施项目,以 C++ 写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、执行时期以及“闲置时期”的优化。LLVM广泛应用于高性能计算、嵌入式系统、移动设备等多种领域。

1.4 安装Ninja

Ninja的安装和编译需要特殊说明一下:
Ninja的使用需要安装visual studio(VS的IDE),并安装C++开发的一些工具,要不然找不到vcvarsall.bat这个文件,无法完成Ninja的编译,也无法完成后续的cmake configuration。
Ninja的安装可以直接下载发布版(ninja-win.zip,无需编译),并直接解压后将Ninja加入环境变量。
Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。

1.5 vscode插件安装

Clangd
CMake
CMake Tools
CMake Language Support

2 工具链和CMakeLists

2.1 工具链(toolchain.cmake)

在settings.json中添加如下参数,编译时引用TOOLCHAIN,省的每次编译都要输路径。

"cmake.configureArgs": ["-DCMAKE_TOOLCHAIN_FILE=${sourceDir}/armcc_toolchain.cmake"]

armcc_toolchain.cmake
简单写了一个demo。

注意:cmake对armcc的识别有版本兼容要求,我在测试armcc v5.06版本时,cmake始终无法识别编译器,因此CMAKE_C_COMPILER 一直是clang,output显示“The C compiler identification is unknown”。
下面demo将路径切换到armclang,可以识别。

option(USE_ARMCC "USE_ARMCC" OFF)
option(USE_ARMCLANG "USE_ARMCLANG" ON)

if (USE_ARMCLANG)

    message(NOTICE "USE_ARMCLANG")
    set(TOOLCHAIN_PATH "D:/Program Files/Keil_v5/ARM/ARM_Compiler_5.06u7/bin")
    set(TOOLCHAIN_PATH "D:/Program Files/Keil_v5/ARM/ARMCLANG/bin")

    set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/armclang.exe")
    set(CMAKE_C_COMPILER_ID "ARMCC")
    message(NOTICE ${CMAKE_C_COMPILER})
    set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH}/armclang.exe")
    set(CMAKE_CXX_COMPILER_ID "ARMCC")
    set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PATH}/armasm.exe")
    set(CMAKE_ASM_COMPILER_ID "ARMASM")

    set(CMAKE_C_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlink.exe")
    set(CMAKE_CXX_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlink.exe")
    set(CMAKE_ASM_LINK_EXECUTABLE "${TOOLCHAIN_PATH}/armlink.exe")

    set(CMAKE_C_ARCHIVE_CREATE "${TOOLCHAIN_PATH}/armar.exe")

    set(FROMELF "${TOOLCHAIN_PATH}/armar.exe")

#    set(CMAKE_TRY_COMPILE_TARGET_TYPE STAIC_LIBRARY)

endif()

注意如下的output信息。toolchain生效和armclang识别。
【vscode】vscode+cmake+llvm+ninja开发环境的搭建(draft)_第1张图片

2.2 CMakeLists.txt

以下是个DEMO,其中还有很多不足,根据具体项目需要调整。
其中,cmake_policy(SET CMP0123 NEW)不是必须的,根据选用的编译器设置。

cmake_minimum_required(VERSION 3.20) ##支持的cmake最低版本
cmake_policy(SET CMP0123 NEW)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION "0.0.1")
set(CMAKE_SYSTEM_PROCESSOR Cotex-M0+)
set(CORE_TYPE ac780x)

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)

# project setting
project("FOC" VERSION 0.0.1 LANGUAGES C ASM)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

message(NOTICE "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")


if (USE_ARMCLANG)
    # 设置C编译器标志
    # -mcpu=cortex-m0+: 目标 CPU 架构为 Cortex-M0+。
    # -mthumb: 生成 Thumb 代码。
    # -mfpu=fpv4-sp-d16: 浮点单元为 FPv4。
    # -O2: 较强的优化。
    # -g: 包含调试信息。
    # -Wall -Wextra: 开启所有警告和额外警告。
    # --apcs=interwork 选项意味着编译器将生成支持 interworking 的代码,即能够在 Thumb 和 ARM 状态之间平滑切换的代码。
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=${CMAKE_SYSTEM_PROCESSOR} -mthumb -O2 
                        --pd '__EVAL SETA 1' -g --apcs=interwork --pd '__MICROLIB SETA 1' 
                        -Wall -Wextra")
    
    # 设置ASM编译器标志
    set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mcpu=${CMAKE_SYSTEM_PROCESSOR} -mthumb -O2 --apcs=interwork")

endif()

set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
set(ELF_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf)

#file(GLOB_RECURSE C_SOURCES CONFIGURE_DEPENDS *.c *.h)
set(C_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Code/Application/main.c)
message(NOTICE "C_SRC_DIR: ${C_SOURCES}")


include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Application
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Configuration
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers/ATC_Driver/Inc
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers/Device/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Drivers/Device/Include/CMSIS
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Foc_Lib/include
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Math
    ${CMAKE_CURRENT_SOURCE_DIR}/Code/Motor

)

add_executable(${PROJECT_NAME} ${C_SOURCES} )
link_libraries(${CMAKE_CURRENT_SOURCE_DIR}/Code/Foc_Lib/src/Foc_Lib.lib)

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMENT "Building ${HEX_FILE}"
        COMMAND ${ARMCC_FROMELF} --i32combined --output="${HEX_FILE}" "${ELF_FILE}"
        )

2.3 基本语法注释

你可能感兴趣的:(码农日常,vscode,c++)