2015-05-16 38 views
1

在为Raspberry Pi或Linux编写程序时,有什么类型的头文件可以包含在C++文件中?Raspberry Pi C++头文件

比如我发现如何从皮用c访问SPI总线这个伟大的指导++(http://hertaville.com/2013/07/24/interfacing-an-spi-adc-mcp3008-chip-to-the-raspberry-pi-using-c/

我能够采取的代码并将其应用到我的情况,是成功地谈得来一个nRF24L01 +射频模块和我能够命令芯片等

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

#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内核一样?这种东西有没有好书?

回到我原来的问题是,有什么样的在线(或离线)文档可以包含哪些头文件可以包含在您的C++项目中,以及它们都添加了哪些功能?

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

感谢所有的想法和帮助! 韦斯利

编辑1

这里是图像表示的输出的 “ls/USR /包括” 命令:

enter image description here

回答

4

TL/DR: 我已经试过下面对此主题进行一般性介绍。如果你是一个更实用的类型,并想跳过文本墙,跳到最后。那里有一些教程链接。跳入陷入导致的问题类堆栈溢出是最好的。

头VS图书馆C/C++

有一个在C++头文件和库之间进行的重要区别。头文件在代码中是可见的,因为它们是你在#包括声明中实际提到的内容。但是,在大多数情况下,包含的头文件与系统上安装的库相对应。

作为一个实际问题,这是两个重要的原因:

  1. 你不一般系统上安装的“头”,在安装碰巧附带头库​​。有一小部分只有头文件的库是这个规则的例外,但通常你有一个二进制库,这个头文件正在促进访问。
  2. #include语句只是故事的一半。通常会有一个相应的编译器选项,您需要指定您要链接到特定的库。在IDE中,这将被埋在项目选项中。对于命令行编译器,这将是一个开关,您可以通过命令行或(更常见)传递到编译器的Make文件或类似文件中。

这第二点是你的标准库的像的iostreamstdio.h中实际上真实的,但这些是由默认情况下链接标准C或C++库支持。

Linux一般

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

除了各种C/C++和Posix标准头之外,您可以使用的头是您在系统上安装的库的功能。这一点很重要,因为可用标题列表包含因特网上所有可用的库,而不仅仅是当前系统恰好安装的那些库。

每个库一般都会被封装为一个Linux发行版的软件包。当您找到所需的库时,您将安装相应的软件包。这会给你所需的头文件和库文件。

在硬盘上寻找库和头文件实际上并不常见,但如果您好奇,头文件通常会在以下某个目录中的某个目录中(或其中的子目录)

/usr/local/include 
    /usr/include 

图书馆将主要在

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

这些将有神秘的名字,其中包括他们的版本号,以及更广泛的(仍然神秘的)名称符号链接到一个与特定版本号被发现。

某些发行版包含独立的“开发”版本的库,其中包含头文件,并且仅默认安装运行时文件(即用户运行程序所需的文件)。如果您的发行版执行此操作,则需要开发包与该库一起编写软件。

当你决定了你需要什么功能时,你通常会去找一个能帮助你完成这个任务的库。你可以在论坛上问一下,或者只是谷歌。

在内核设备驱动程序

大多数图书馆将通过一个设备驱动程序的设备接口。在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.这将帮助您了解可用内容,如何获取内核源代码的副本等。如果您想编写驱动程序,这也是很好的知识。如果你开发了一些新的东西,它也是学习如何让代码提交给内核的地方。

最后,编写自己的设备驱动程序是可能的,并且不会被吓到。不过,这个主题的细节可能会填满一本书,所以当你准备好尝试时,这是谷歌的东西。

的Linux上的树莓派

首先要了解关于皮的是,它是在很多方面,从一台PC运行Linux的没有什么不同。您在PC上发现的关于Linux系统编程的一般信息同样适用于Pi。唯一的警告是处理器架构不同(ARM,vs Intel/AMD),而且Pi有一些硬件项目(如I2C,SPI和GPIO),这些项目并不常见,或者至少不常用PC。

实际上Pi上有不止一个可用的Linux发行版。这些通常来自通用的PC发行版 - Ubuntu派生的发行版是最常见的。你需要找到你有任何发行版的网站。

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

This看起来像一个有前途的图书馆,可能是一个很好的起点。

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

This导致一些SPI示例代码。

+0

我用“ls/usr/include”的输出将图像添加到原始文章中。所以我可以看到它确实包含头文件,并且我认识了其中的一些例如“math.h”等。有趣的是,我没有看到“iostream”,这是一个很常见的。 –

+0

当你说'确定你需要什么库'时,你如何做到这一点?这是我的问题。因此,例如,如果我试图编写自己的SPI驱动程序或试图写一个可能的I2C等。我怎么知道哪些头文件包括哪些功能和哪些功能/头文件可供您使用?那是我卡住的地方。 –

+0

也许我应该补充一点,我有相当多的过去的编程经验,但是对于linux和C++来说是相对较新的。我以前的大部分经验都是使用C#,XAML,WPF等进行更高级别的工作。 –