AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79598215
Accepted
doug
doug
Asked: 2025-04-29 19:08:38 +0800 CST2025-04-29 19:08:38 +0800 CST 2025-04-29 19:08:38 +0800 CST

Pico 硬件 SDK 选项不适用于 C++

  • 772

我正在 VS Code 中尝试 Pico SDK 和扩展程序,但当我用 C++ 而不是 C 语言编写文件程序时,似乎很多硬件选项都无法使用了。具体来说,我更倾向于使用 ADC。

#include "hardware/adc.h"

这在 C 程序中运行良好,但在 C++ 中不再可用。

 fatal error: hardware/adc.h: No such file or directory

为什么会这样?我该怎么办?我更喜欢用 C++ 来编写程序,因为我想使用 C++ 附带的一些标准库,而且对我来说,C++ 更直观。

c++
  • 1 1 个回答
  • 41 Views

1 个回答

  • Voted
  1. Best Answer
    Maruf Hassan Naim Sheikh
    2025-04-29T19:21:54+08:002025-04-29T19:21:54+08:00

    Pico SDK 是用 C 编写的,其头文件使用C 链接。当您切换到 C++ 时,C++ 编译器会以不同的方式处理包含的头文件,除非您明确告诉它将它们视为 C 头文件。

    在 C++ 中,如果头文件是用 C 编写的但没有使用 保护extern "C",C++ 编译器会尝试对函数进行名称修改(即更改其名称),这会导致链接错误或丢失文件错误,具体取决于包含设置。

    此外,根据文件的扩展名和 CMake 设置,构建系统可能会在错误的位置查找标题或不将某些文件作为目标的一部分进行编译。

    ✅ 如何修复

    1.✅在 C++ 文件中使用C 头文件extern "C"

    #include像这样包装你:

    extern "C" {
        #include "hardware/adc.h"
    }
    

    这告诉 C++ 编译器将这些 C 头文件视为 C而不是 C++ — — 因此链接和名称解析可以正常工作。

    2.✅检查你的 CMakeLists.txt

    确保您的 CMake 文件已正确设置为 C++。

    在您的中CMakeLists.txt,确认您告诉它使用 C++:

    project(my_project C CXX)
    
    add_executable(my_project
        main.cpp
    )
    
    target_link_libraries(my_project
        pico_stdlib
        hardware_adc
    )
    
    pico_add_extra_outputs(my_project)
    
    Make sure:
    
    You use main.cpp, not main.c
    
    You link the correct libraries like hardware_adc if needed.
    
    3. ✅ Include Standard C++ Libraries
    You can freely use #include <iostream>, std::string, etc., alongside Pico SDK headers, as long as you properly wrap the C includes as shown above.
    
    📌 Final Example (main.cpp):
    #include <iostream>
    #include <stdio.h>
    
    extern "C" {
        #include "pico/stdlib.h"
        #include "hardware/adc.h"
    }
    
    int main() {
        stdio_init_all();
        adc_init();
        adc_select_input(0);
    
        while (true) {
            uint16_t result = adc_read();
            std::cout << "ADC Value: " << result << std::endl;
            sleep_ms(500);
        }
    
        return 0;
    }
    
    ✅ Summary
    Use extern "C" when including C headers in a .cpp file.
    
    Confirm your CMakeLists.txt is correctly configured for C++.
    
    You can freely mix C++ features with the Pico SDK.
    
    • 1

相关问题

  • 为什么编译器在这里错过矢量化?

  • 使用带有库的 CMake 编译错误[关闭]

  • 每次我尝试运行预制时都会抛出错误

  • 如何在 C++ 中创建类似于 std::byte 的八位字节类型?

  • C++17 中 std::byte 只能按位运算?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve