【问题标题】:Raspberry Pi C++ Header Documentation树莓派 C++ 头文件文档
【发布时间】:2015-05-16 03:08:30
【问题描述】:

在为 Raspberry Pi 或一般的 linux 编写程序时,是否可以在 c++ 文件中包含哪些类型的标头?

例如,我找到了这篇关于如何使用 c++ 从 Pi 访问 SPI 总线的精彩指南 (http://hertaville.com/2013/07/24/interfacing-an-spi-adc-mcp3008-chip-to-the-raspberry-pi-using-c/)

我能够获取代码并将其应用于我的情况,并且成功地能够与 nRF24L01+ RF 模块通信,并且我能够控制芯片等。

但是当我开始尝试调查代码的作用时(因为我想知道我从互联网上获得的代码是如何工作的),我很快就迷路了。例如,该代码的作者是如何知道包含他所做的头文件的:

#include <unistd.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string>
#include <iostream>

我知道诸如“iostream”之类的文件是做什么的,但我想我会通过谷歌搜索诸如 ("unistd.h") 之类的头文件名来解决它,但没有运气。我发现了很多信息,但没有一个与 Pi 相关,而且我只是开始引用其他头文件和代码。这是不是太多的尝试和学习,就像我有效地尝试学习 linux 内核一样?这类东西有什么好书吗?

回到我最初的问题,是否有任何类型的在线(或离线)文档来说明您可以在 Pi 上的 c++ 项目中包含哪些头文件以及它们都添加了哪些功能?

我发现这个(http://www.cplusplus.com/reference/)有标准文件,但是你怎么知道所有的非标准头文件和相应的功能呢?

感谢所有想法和帮助,谢谢! 卫斯理

编辑 1

这是显示“ls /usr/include”命令输出的图像:

【问题讨论】:

    标签: c++ linux linux-kernel raspberry-pi embedded-linux


    【解决方案1】:

    TL/DR: 我试图在下面对这个主题进行一般性介绍。如果您是一个更动手的类型并且想跳过文字墙,请跳到最后。那里有一些教程链接。跳进去——卡住会导致 Stack Overflow 最擅长的问题。

    C/C++ 中的标头与库

    C++ 中的头文件和库之间有一个重要的区别。头文件在您的代码中是可见的,因为它们是您在 #include 语句中实际提及的内容。但是,在大多数情况下,您包含的标头对应于系统上安装的库。

    实际上,这很重要,原因有两个:

    1. 您通常不会在系统上安装“头文件”,而是安装恰好带有头文件的库。有少数只有标头的库是此规则的例外,但通常您在标头便于访问的某个地方有一个二进制库。
    2. #include 语句只是故事的一半。通常有一个相应的编译器选项,您需要在其中指定要链接到特定库。在 IDE 中,这将隐藏在某个项目选项中。对于命令行编译器,这将是您在命令行或(更常见)在 Make 文件或类似文件中传递给编译器的开关。

    第二点实际上适用于您的标准库,如 iostreamstdio.h,但这些由标准 C 或 C++ 库支持,该库由默认。

    一般的 Linux

    大多数 linux 发行版都会附带某种包管理器。有很多可用的(Ubuntu 使用 Apt,Redhat 使用 yum,Arch 使用 pacman,Gentoo 使用 portage 等)。实际使用的管理器是发行版的定义属性之一。在 Distro 的网页上很容易找到文档。这是一个非常重要的理解工具。

    除了各种 C/C++ 和 Posix 标准头文件外,您可以使用的头文件是您系统上安装的库的功能。理解这一点很重要,因为可用标头列表包含 Internet 上所有可用的库,而不仅仅是您的系统目前恰好安装的少数库。

    每个库通常都会打包为您的 linux 发行版的一个包。当您找到所需的库时,安装相应的包。这将为您提供所需的头文件和库文件。

    在硬盘驱动器上查找库和头文件实际上并不常用,但如果您好奇,头文件通常会在以下目录之一(或其中的子目录)中结束

        /usr/local/include
        /usr/include
    

    图书馆大多位于

        /lib
        /usr/lib
        /usr/local/lib
    

    这些将具有包含其版本号的神秘名称,以及一个更通用(仍然神秘)的名称,该名称符号链接到具有特定版本号的名称。

    一些发行版有单独的“开发”版本的库,包括头文件,并且默认只安装运行时文件(即用户运行程序所需的文件)。如果您的发行版这样做,您将需要开发包来使用该库编写软件。

    当您决定了所需的功能后,您通常会去寻找可以帮助您完成该任务的库。您可以在论坛上四处打听,或者直接在 Google 上搜索。

    内核中的设备驱动程序

    大多数库将通过设备驱动程序与设备交互。在 linux 中,设备驱动程序被编译到内核中,或者作为加载到内核中的模块存在。您的 Pi 发行版有望随附现有硬件所需的所有驱动程序。如果没有,您需要获取内核模块或重新编译内核以包含所需的驱动程序。模块和用于加载/卸载它们的适当脚本通常作为您的发行版的包提供,就像库一样。

    可以编写软件直接与驱动程序对话。这是一个非常广泛的话题。您最好的选择是选择一个设备(即 I2C、SPI 等)并在谷歌上找到一个专门在 Pi 上与该设备交互的教程。

    This tutorial addresses the basics of writing a loadable module. 如果您想编写自己的 SPI 驱动程序,这将是一个不错的起点。

    This is a good place to go for a general kernel overview.它将帮助您了解可用的内容,如何获取内核源代码的副本等。如果您想编写驱动程序,这也是一个很好的知识。如果您开发新的东西,它也是学习如何将代码提交到内核的地方。

    最后,编写自己的设备驱动程序是可能的,而且不必害怕。不过,该主题的详细信息可能会写满一本书,因此当您准备好尝试时,可以通过 Google 搜索。

    Raspberry Pi 上的 Linux

    首先要了解 Pi,它在大多数方面与运行 linux 的 PC 没有什么不同。您在 PC 上找到的有关 linux 系统编程的任何一般信息都将同样适用于 Pi。唯一需要注意的是处理器架构不同(ARM,与 Intel/AMD),并且 Pi 有一些硬件项目(如 I2C、SPI 和 GPIO)在个人电脑。

    在 Pi 上实际上有不止一个 linux 发行版可用。这些通常来自常见的 PC 发行版——Ubuntu 衍生发行版是最常见的。您需要找到您拥有的任何发行版的网站。

    如果您尝试在包管理器之外安装东西,则需要小心为 ARM 处理器编译库(或您自己编译的源库)。有一些例外,但绝大多数开源库都应该可以在 ARM 上使用。

    This 看起来是一个很有前途的库,可能是一个很好的起点。

    This 看起来像是一个很好的 GPIO(通用输入/输出——即,您可以切换的引脚)教程。

    This 导致一些 SPI 示例代码。

    【讨论】:

    • 我在原始帖子中添加了一张图片,其中包含“ls /usr/include”的输出。所以我可以看到它确实包含头文件,并且我认出了其中的一些,例如“math.h”等。有趣的是,我没有看到很常见的“iostream”。
    • 当你说“确定你需要什么库”时,你是怎么做的?那是我的问题。因此,例如,如果我尝试编写自己的 SPI 驱动程序或尝试为可能的 I2C 编写一个驱动程序等,我怎么知道哪些头文件包含哪些功能以及哪些功能/头文件可供您使用?这就是我卡住的地方。
    • 也许我应该补充一点,我过去有相当多的编程经验,但对 linux 和 c++ 还比较陌生。我以前的大部分经验是使用 C#、XAML、WPF 等进行更高级别的工作。
    • 啊,这说明了您在寻找什么。我添加了一些东西让你开始。你会发现这个问题导致了一个相当深的兔子洞。 C/C++ 的头文件和库集并没有像高级语言那样受到限制,因为它是编写操作系统的语言。迟早(可能更早)你会发现自己大量的 linux 内核源代码位于您的硬盘上。
    • 最后一件事——在终端输入“g++”以确保已安装。这是 C++ 编译器的二进制名称。 C 编译器通常默认包含在内,但 C++ 通常不包含。这可能会导致一些混乱。
    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多