2015-05-16 115 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等進行更高級別的工作。 –