cmake编译S32K的bin文件(2)

目录

一、S32DS文件目录

二、cmake移植文件目录

三 开始执行脚本

四、cmake目录


 Project_Settings 这是启动文件

SDK 这是将寄存器封装成函数调用接口

Generated_Code S32DS组件库,调用SDK生成模块对应接口函数

Suorces 自己的文件,包含函数

这是我们主要要移植的代码,顺序从上往下不能混淆。

二、cmake移植文件目录

.vscode 配置文件

 

 build 生成文件bin文件目录

 

cmake cmake执行脚本,从最下面的txt进入

code 移植代码

三 开始执行脚本

最下面txt,cmake脚本

# cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
# min 需要最低版本的 cmake max 最高版本 。。。 区间
cmake_minimum_required(VERSION 3.19)

# project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
# project(<PROJECT-NAME>
#         [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
#         [LANGUAGES <language-name>...])
# 为整个项目设置名称、版本和启用语言
project(tpms
VERSION 6.0.0 
LANGUAGES C ASM
)


# SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

# list(LENGTH <list><output variable>)
# list(GET <list> <elementindex> [<element index> ...]<output variable>)
# list(APPEND <list><element> [<element> ...])
# list(FIND <list> <value><output variable>)
# list(INSERT <list><element_index> <element> [<element> ...])
# list(REMOVE_ITEM <list> <value>[<value> ...])
# list(REMOVE_AT <list><index> [<index> ...])
# list(REMOVE_DUPLICATES <list>)
# list(REVERSE <list>)
# list(SORT <list>)
#
# LENGTH            返回list的长度
# GET             返回list中index的element到value中
# APPEND            添加新element到list中
# FIND            返回list中element的index,没有找到返回-1
# INSERT            将新element插入到list中index的位置
# REMOVE_ITEM         从list中删除某个element
# REMOVE_AT         从list中删除指定index的element
# REMOVE_DUPLICATES     从list中删除重复的element
# REVERSE         将list的内容反转
# SORT          将list按字母顺序排序
# 将当前目录下的cmake文件夹加入环境变量
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

# 从文件或模块加载和运行 CMake 代码
# include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>][NO_POLICY_SCOPE])
# 
include(utilities)

# add_compile_definitions(<definition> ...)
# 将预处理器定义添加到源文件的编译中。 宏定义
add_compile_definitions(
    CPU_S32K144HFT0VLLT
    USING_OS_RTTHREAD
)

# add_subdirectory(source_dir [binary_dir][EXCLUDE_FROM_ALL])
# 将子目录添加到构建中
add_subdirectory(code)

# 设置源文件
set(SOURCES code/Sources/main.c)

# add_executable(<name> [WIN32] [MACOSX_BUNDLE]
#               [EXCLUDE_FROM_ALL]
#               source1 [source2 ...])
# 使用指定的源文件向项目添加可执行文件
# main.c 启动文件
#
# set_target_properties(target1 target2 ...
#                       PROPERTIES prop1 value1
#                       prop2 value2 ...)
# 目标可以具有影响其构建方式的属性。
# 链接库 后缀
# 
# target_link_options(<target> [BEFORE]
#                    <INTERFACE|PUBLIC|PRIVATE> [items1...]
#                    [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
# 向目标添加链接选项。
# PRIVATE和PUBLIC
function(create_target TARGET STARTUP LINKER)
    add_executable(${TARGET}
        ${SOURCES}
        ${STARTUP}
    )

    set_target_properties(${TARGET}
        PROPERTIES 
            LINK_DEPENDS ${LINKER}
            SUFFIX ".elf"
    )
    
    target_link_options(${TARGET}
        PUBLIC 
            -T${LINKER} -Wl,-Map=${TARGET}.map
    )

    target_link_libraries(${TARGET}

        -Wl,--whole-archive
        # -Wl,--start-group
        sdk
        Generated_Code
        source

        # -Wl,--end-group
        -Wl,--no-whole-archive
    )

    create_bin_output(${TARGET})
    create_hex_output(${TARGET})
    firmware_size(${TARGET})
    # symbol_size(${TARGET})

endfunction()

set(LINKER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/code/Project_Settings/Linker_Files/S32K144_64_flash.ld")
set(STARTUP_FILE "${CMAKE_CURRENT_LIST_DIR}/code/Project_Settings/Startup_Code/startup_S32K144.S")

create_target(${PROJECT_NAME} ${STARTUP_FILE} ${LINKER_SCRIPT})

四、cmake目录

utilities.cmake 生成文件时会打印文件大小

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# 低于最低版本报错,平常是警告
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

# Create the bin output 创建二进制输出文件
# function(<name>[arg1 [arg2 [arg3 ...]]])
#           COMMAND1(ARGS ...)
#           COMMAND2(ARGS ...)
#           ...
#           endfunction(<name>)
# 定义一个函数名为<name>,参数名为arg1 arg2 arg3(…)。 
# 函数体内的命令直到函数被调用的时候才会去执行。
# 其中ARGC变量表示传递给函数的参数个数。
# ARGV0, ARGV1, ARGV2代表传递给函数的实际参数。 
# ARGN代表超出最后一个预期参数的参数列表,
# 例如,函数原型声明时,只接受一个参数,那么调用函数时传递给函数的参数列表中,
# 从第二个参数(如果有的话)开始就会保存到ARGN。
# 
# 在很多时候,需要在cmake中创建一些目标,如clean、copy等等,
# 这就需要通过add_custom_target来指定。
# 同时,add_custom_command可以用来完成对add_custom_target生成的target的补充。
# add_custom_target(Name [ALL] [command1 [args1...]]
#                   [COMMAND command2 [args2...] ...]
#                   [DEPENDS depend depend depend ... ]
#                   [BYPRODUCTS [files...]]
#                   [WORKING_DIRECTORY dir]
#                   [COMMENT comment]
#                   [JOB_POOL job_pool]
#                   [VERBATIM] [USES_TERMINAL]
#                   [COMMAND_EXPAND_LISTS]
#                   [SOURCES src1 [src2...]])
# 
# ALL:表明该目标会被添加到默认的构建目标,使得它每次都被运行;
# COMMAND:指定要在构建时执行的命令行;
# DEPENDS:指定命令所依赖的文件;
# COMMENT:在构建时执行命令之前显示给定消息;
# WORKING_DIRECTORY:使用给定的当前工作目录执行命令。如果它是相对路径,它将相对于对应于当前源目录的构建树目录;
# BYPRODUCTS:指定命令预期产生的文件。
#
# 调用arm-none-eabi-objcopy.exe
# D:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2020-q4-major\bin
# 将elf转换为bin hex
# 带路径的文件 指令 源文件 生成文件
function(create_bin_output TARGET)
    add_custom_target(${TARGET}.bin ALL 
        DEPENDS ${TARGET}
        COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin)
endfunction()

# Creates output in hex format 创建八进制输出文件
function(create_hex_output TARGET)
    add_custom_target(${TARGET}.hex ALL 
    DEPENDS ${TARGET} 
    COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex)
endfunction()

# Add custom command to print firmware size in Berkley format
# 添加自定义命令以伯克利格式打印固件大小
function(firmware_size TARGET)
    add_custom_target(${TARGET}.size ALL 
        DEPENDS ${TARGET} 
        # COMMAND ${CMAKE_SIZE_UTIL} -B ${TARGET}.elf
        COMMAND ${CMAKE_SIZE_UTIL}  ${TARGET}.elf
        # COMMAND ${CMAKE_SIZE_UTIL} -B ${TARGET}.hex
        # COMMAND ${CMAKE_SIZE_UTIL} --format=berkeley ${TARGET}.elf ${TARGET}.hex
        )
endfunction()

# Output size of symbols in the resulting elf
# 打印十六进制文件大小
function(symbol_size TARGET)
    add_custom_target(${TARGET}.nm ALL
        DEPENDS ${TARGET}
        COMMAND ${CMAKE_NM_UTIL} --print-size --size-sort --radix=d ${TARGET}.elf)
endfunction()

arm-gcc-cortex-m4.cmake 编译条件

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

set(MCPU_FLAGS "-mthumb -mcpu=cortex-m4")
set(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(LD_FLAGS "")
set(SPECS_FLAGS "-specs=nano.specs -specs=nosys.specs")

include(${CMAKE_CURRENT_LIST_DIR}/arm-gcc-toolchain.cmake)

arm-gcc-toolchain.cmake 编译工具

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TARGET_TRIPLET "arm-none-eabi-")

# do some windows specific logic 一些特定于Windows的逻辑
# 执行一个或多个子进程。
# COMMAND CMake使用操作系统的APIs直接执行子进程。所有的参数逐字传递。
# 没有中间脚本被使用
# 将二进制文件变成window可执行文件
if(WIN32)
    set(TOOLCHAIN_EXT ".exe")
    execute_process(
        COMMAND ${CMAKE_CURRENT_LIST_DIR}/vswhere.exe -latest -requires Component.MDD.Linux.GCC.arm -find **/gcc_arm/bin
        OUTPUT_VARIABLE VSWHERE_PATH
    )
else()
    set(TOOLCHAIN_EXT "")
endif(WIN32)

# default to Release build 默认为发布构建
if(NOT CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE "Debug" CACHE STRING
            "Choose the type of build, options are: Debug Release."
            FORCE)
endif()

# 查找程序 arm-none-eabi-gcc.exe
find_program(COMPILER_ON_PATH "${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT}")

if(DEFINED ENV{ARM_GCC_PATH}) 
    # use the environment variable first  首先使用环境变量  
    file(TO_CMAKE_PATH $ENV{ARM_GCC_PATH} ARM_TOOLCHAIN_PATH)
    message(STATUS "Using ENV variable ARM_GCC_PATH = ${ARM_TOOLCHAIN_PATH}")
elseif(COMPILER_ON_PATH) 
    # then check on the current path 然后检查当前路径
    get_filename_component(ARM_TOOLCHAIN_PATH ${COMPILER_ON_PATH} DIRECTORY)
    message(STATUS "Using ARM GCC from path = ${ARM_TOOLCHAIN_PATH}")
elseif(DEFINED VSWHERE_PATH) 
    # try and find if its installed with visual studio
    # 试着看看它是否安装了visual studio
    file(TO_CMAKE_PATH ${VSWHERE_PATH} ARM_TOOLCHAIN_PATH)
    string(STRIP ${ARM_TOOLCHAIN_PATH} ARM_TOOLCHAIN_PATH)
    message(STATUS "Using Visual Studio install ${ARM_TOOLCHAIN_PATH} yes")
# else() 
#     # otherwise just default to the standard installation
#     set(ARM_TOOLCHAIN_PATH "C:/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/bin")
#     message(STATUS "Using ARM GCC from default Windows toolchain directory ${ARM_TOOLCHAIN_PATH}")
endif()

# perform compiler test with the static library 使用静态库执行编译器测试
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# 设置编译工具的路径 arm-none-eabi-gcc.exe
# D:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2020-q4-major\bin
set(CMAKE_C_COMPILER    ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
set(CMAKE_CXX_COMPILER  ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}g++${TOOLCHAIN_EXT})
set(CMAKE_ASM_COMPILER  ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
set(CMAKE_LINKER        ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}gcc${TOOLCHAIN_EXT})
set(CMAKE_SIZE_UTIL     ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}size${TOOLCHAIN_EXT})
set(CMAKE_OBJCOPY       ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objcopy${TOOLCHAIN_EXT})
set(CMAKE_OBJDUMP       ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}objdump${TOOLCHAIN_EXT})
set(CMAKE_NM_UTIL       ${ARM_TOOLCHAIN_PATH}/${TARGET_TRIPLET}nm${TOOLCHAIN_EXT})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(CMAKE_COMMON_FLAGS " -fdiagnostics-color=always -ffunction-sections -fdata-sections -Wunused -Wuninitialized -Wall")
set(CMAKE_C_FLAGS 	"${MCPU_FLAGS} ${VFP_FLAGS} ${SPECS_FLAGS} ${CMAKE_COMMON_FLAGS}")
set(CMAKE_CXX_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} ${SPECS_FLAGS} ${CMAKE_COMMON_FLAGS}")
set(CMAKE_ASM_FLAGS " -Wa,-mimplicit-it=thumb -mcpu=cortex-m4 -x assembler-with-cpp ${VFP_FLAGS} ${SPECS_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${LD_FLAGS} -Wl,--gc-sections,-print-memory-usage")

set(CMAKE_C_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_CXX_ASM_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_C_ASM_FLAGS_DEBUG "-g3")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "")

set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_ASM_FLAGS_RELEASE "")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto")

<think>好的,用户遇到了CMake编译后未生成预期的bin、lib、x64文件夹的问题。我需要先分析可能的原因,然后根据提供的引用内容给出解决方案。 首先,用户可能没有在CMakeLists.txt中正确设置输出目录。根据引用3中的示例,用户的项目结构可能没有明确指定生成目录,导致生成文件直接放在根目录下。需要检查是否使用了set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)这样的命令来指定输出路径。 其次,用户可能在执行cmake命令时没有指定生成器,或者生成器与MinGW不兼容。引用1中提到CMAKE_MAKE_PROGRAM未设置的问题,解决方法是指定MinGW的make路径。同样,在引用2中,用户需要确保正确使用cmake .cmake --build .命令,并且生成器正确。如果用户使用的是Visual Studio,可能需要指定不同的生成器,比如-G "MinGW Makefiles",并确保环境变量配置正确。 另外,用户可能没有正确配置构建类型,比如Debug或Release模式,这可能导致输出路径不同。需要检查是否在cmake命令中指定了-DCMAKE_BUILD_TYPE=Release,或者在构建时使用--config参数。 还要考虑CMake版本和生成器是否匹配。引用3中提到cmake_minimum_required的版本设置,如果版本过低可能影响功能。建议用户检查CMake版本是否符合要求,并更新到最新版本。 最后,可能用户的项目中没有可执行文件或库的目标,比如add_executable或add_library未被正确调用,导致没有生成对应的文件。需要确保CMakeLists.txt中有正确的目标定义,比如add_executable(hello hello.cpp)。 总结解决方案步骤:首先检查CMakeLists.txt中的输出目录设置,然后确保使用正确的生成器和构建命令,配置构建类型,验证CMake版本,以及确认目标是否正确添加。同时,根据引用中的信息,用户需要正确设置CMAKE_MAKE_PROGRAM环境变量或通过CMake命令指定生成器。</think>针对CMake编译后未生成`bin`、`lib`、`x64`等目录的问题,以下是分步解决方案: --- ### **原因分析** 1. **未显式设置输出目录** CMake默认将生成的可执行文件(如`.exe`)和库文件(如`.dll`、`.lib`)直接放在构建根目录下,而非`bin`或`lib`子目录[^3]。 2. **生成器(Generator)配置错误** 若未正确选择生成器(如MinGW、Visual Studio等),可能导致构建路径不符合预期[^1][^2]。 3. **未指定构建类型(Build Type)** 如`Debug`或`Release`模式,某些项目会根据构建类型生成不同的输出路径(如`x64/Debug`)。 --- ### **解决方案** #### **步骤1:在CMakeLists.txt中设置输出目录** 在项目的`CMakeLists.txt`中添加以下代码,强制指定输出路径: ```cmake # 设置可执行文件输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) # 设置库文件输出目录 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib) ``` 此配置会确保生成文件位于`bin`和`lib`目录中[^3]。 #### **步骤2:选择正确的生成器** 在生成构建系统时,需明确指定生成器(Generator): ```bash # 示例:使用MinGW生成cmake -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=C:/Qt/Qt5.12.11/Tools/mingw730_64/bin/mingw32-make.exe .. ``` 若使用Visual Studio,则需指定`-G "Visual Studio 17 2022"`并添加`-A x64`参数生成`x64`目录[^1][^2]。 #### **步骤3:指定构建类型** 在配置时指定构建类型(如`Release`或`Debug`): ```bash cmake -DCMAKE_BUILD_TYPE=Release .. ``` 或在构建时指定: ```bash cmake --build . --config Release ``` 某些项目会根据构建类型生成`x64/Release`或`x64/Debug`目录。 #### **步骤4:验证构建系统生成** 确保执行`cmake`后生成`Makefile`或`.sln`文件。若未生成,检查: - CMake版本是否兼容(如`cmake_minimum_required(VERSION 3.10)`) - 生成器是否与编译器匹配(如MinGW需配合`MinGW Makefiles`生成器) #### **步骤5:执行构建命令** 使用以下命令触发编译: ```bash cmake --build . ``` 构建完成后,检查`bin`、`lib`或`x64`目录是否生成。 --- ### **补充说明** - **路径分隔符问题**:Windows系统建议使用`/`而非`\`,避免转义错误。 - **环境变量配置**:确保`CMake`、`MinGW`或`MSVC`的`bin`目录已添加到系统环境变量`Path`中。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值