Raspberry Pi C++ 头文档

Raspberry Pi C++ Header Documentation

一般情况下,在为 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 模块通信,并且我能够命令芯片等。

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

#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") 来解决它,但没有运气。我发现了很多信息,但 none 与 Pi 有关,而我所做的一点点只是开始引用其他头文件和代码。尝试和学习这是否太多了,就像我有效地尝试学习 linux 内核一样?有没有这方面的好书?

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

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

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

编辑 1

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

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

Headers 与 C/C++

中的库

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

作为一个实际问题,这很重要,原因有二:

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

第二点实际上适用于您的标准库,例如 iostreamstdio.h,但这些库由默认情况下 link 加入的标准 C 或 C++ 库。

Linux 一般

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

除了各种 C/C++ 和 Posix 标准 headers 之外,您可以使用的 headers 是图书馆的一个功能你已经安装在你的系统上。理解这一点很重要,因为可用 header 列表包含 Internet 上所有可用的库,而不仅仅是您的系统目前恰好安装的少数库。

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

实际上在硬盘上查找库和 headers 并不经常有用,但如果您好奇的话,header 文件通常会出现在某个位置以下目录(或其中的子目录)

    /usr/local/include
    /usr/include

图书馆主要位于

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

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

一些发行版有单独的 "development" 版本的库,其中包括 headers,默认情况下只安装 运行time 文件(即用户需要 运行 你的程序)。如果您的发行版这样做,您将需要开发包来使用该库编写软件。

当您确定了所需的功能后,通常会寻找一个可以帮助您完成该任务的库。你可以在论坛上四处询问,或者只是 google 他们。

内核中的设备 drivers

大多数图书馆将通过设备 driver 与设备交互。在 linux 中,设备 driver 被编译到内核中,或者作为加载到内核中的模块出现。您的 Pi 发行版有望随附当前硬件所需的所有 driver。如果没有,您将需要获得一个内核模块或重新编译您的内核以包含所需的 driver。 load/unload 它们的模块和适当的脚本通常作为您的发行版的包提供,就像库一样。

可以编写软件直接与 driver 对话。这是一个非常广泛的话题。最好的选择是选择一个设备(即 I2C、SPI 等)和 google 专门用于在 Pi 上与该设备接口的教程。

This tutorial addresses the basics of writing a loadable module. 如果您想编写自己的 SPI,这将是一个很好的起点 driver。

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

最后,编写自己的设备 drivers有可能,并不可怕。不过,此主题的详细信息可能会写成一本书,因此当您准备好尝试时,google 会有所帮助。

Linux 上 Raspberry Pi

关于 Pi 的第一件事是,它在大多数方面与 PC 运行ning linux 没有什么不同。您在 PC 上找到的有关 linux 系统编程的任何一般信息都同样适用于 Pi。唯一需要注意的是处理器架构不同(ARM,vs Intel/AMD),并且 Pi 有一些不常见的硬件项目(如 I2C、SPI 和 GPIO),或者至少不经常与之接口,在 PC 上。

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

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

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

This 看起来像是一个不错的 GPIO(通用 Input/Output -- 即,您可以切换的引脚)教程。

This 导致一些 SPI 示例代码。