CubeIDE C/C++混合编译 全网最简单教程 CubeMX

起因

起因是笔者要移植一个Arduino库到STM32。这个库使用了C++的面向对象,转写为C工程量较大,故有此文。

环境

STM32CubeIDE v1.16.1

STM32CubeMX v6.12.1

实操

简析调用关系

现有一个后缀为.cpp的陀螺仪驱动文件,涉及一些调用关系:

  • BNO08x_Driver.cpp调用了I2C函数和UART函数,也有一些操作涉及中断
  • BNO08x_Driver.cpp中的函数被main.c调用。

所以上述所有涉及.c文件(i2c.cusart.cmain.c,如果你勾选了Generate peripheral initialization as a pair of '.c/.h' files per peripheral则会有单独的i2c.cusart.c)都需要改后缀为.cpp

请添加图片描述

请添加图片描述

转换为C++

没错,CubeIDE就是这么善解人意。按理说你点了这个,此文到此结束了就(但是还建议你继续往下看bushi)。

请添加图片描述

蛮聪明的确实,会自动选择编译器编译.c.cpp

请添加图片描述
诶?这是什么鬼!

请添加图片描述

什么都不报错,偏偏class报错……而class是C++的特性……

再往前一看,“In file included from”,回想我们前文简析调用关系,原来是stm32l4xx_hal_msp.c没有改写为.cpp。修复后编译无误:

请添加图片描述

总结:至此已经可以使用C/C++混合编译,编译器已经正常工作。其他问题请修改代码(99%是语法问题)。

.c.cpp互换*

这很重要。

什么时候需要修改后缀?答:使用CubeMX重新生成代码时,如果你不想CubeMX没法儿识别源文件,然后你的项目共存main.cmain.cpp的话。

附上一段Python(使用的时候需要修改路径,制定需要转换的文件列表):

import os

# 指定根目录,确保路径与实际文件路径一致
root_directory = "/Users/lff/GitHub/AI-MEMS/Embedded/AI-MEMS"

# 指定需要转换的文件相对路径列表(相对于 root_directory)
file_paths = [
    "Core/Src/gpio.c",   # 初始状态可以是 .c 或 .cpp
    "Core/Src/i2c.c",
    "Core/Src/main.c",
    "Core/Src/stm32l4xx_hal_msp.c",
    "Core/Src/stm32l4xx_it.c",
    "Core/Src/usart.c"
]

# 标志位,用来确定文件当前是否是 .c
all_are_c = True

# 遍历指定文件路径检查是否所有文件都是 .c
for relative_path in file_paths:
    # 获取文件的完整路径
    file_path = os.path.join(root_directory, relative_path)

    # 如果当前文件不是 .c 则标志位设置为 False
    if not os.path.isfile(file_path):
        all_are_c = False
        break

# 根据当前状态决定目标扩展名
if all_are_c:
    target_extension = ".cpp"
    source_extension = ".c"
else:
    target_extension = ".c"
    source_extension = ".cpp"

# 执行文件名切换
for relative_path in file_paths:
    # 获取文件的完整路径
    file_path = os.path.join(root_directory, relative_path.replace(".c", source_extension).replace(".cpp", source_extension))

    # 目标路径,切换扩展名
    new_file_path = file_path[:-len(source_extension)] + target_extension

    # 重命名文件
    if os.path.isfile(file_path):
        os.rename(file_path, new_file_path)
        print(f"Renamed: {file_path} -> {new_file_path}")
    else:
        print(f"File not found or already renamed: {file_path}")

print(f"All files have been converted to {target_extension}.")

.py文件的位置:

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值