Linux下C應用程式開發

2021-01-04 電子產品世界

本文介紹了在

Linux

下能用於 C

應用程式開發

和調試的工具. 本文的主旨是介紹如何在

Linux

下使用 C 編譯器和其他 C 編程工具, 而非 C 語言編程的教程.

  GNU C 編譯器

  GNU C 編譯器(GCC)是一個全功能的 ANSI C 兼容編譯器. 如果你熟悉其他作業系統或硬體平臺上的一種 C 編譯器, 你將能很快地掌握 GCC. 本節將介紹如何使用 GCC 和一些 GCC 編譯器最常用的選項.

  使用 GCC

  通常後跟一些選項和文件名來使用 GCC 編譯器. gcc 命令的基本用法如下:

  gcc [options] [filenames]

  

  命令行選項指定的操作將在命令行上每個給出的文件上執行. 下一小節將敘述一些你會最常用到的選項.

  

  GCC 選項

  

  GCC 有超過100個的編譯選項可用. 這些選項中的許多你可能永遠都不會用到, 但一些主要的選項將會頻繁用到. 很多的 GCC 選項包括一個以上的字符. 因此你必須為每個選項指定各自的連字符, 並且就象大多數

Linux

命令一樣你不能在一個單獨的連字符後跟一組選項. 例如, 下面的兩個命令是不同的:

  

  gcc -p -g test.c

  gcc -pg test.c

  第一條命令告訴 GCC 編譯 test.c 時為 prof 命令建立剖析(profile)信息並且把調試信息加入到可執行的文件裡. 第二條命令只告訴 GCC 為 gprof 命令建立剖析信息.

當你不用任何選項編譯一個程序時, GCC 將會建立(假定編譯成功)一個名為 a.out 的可執行文件. 例如, 下面的命令將在當前目錄下產生一個叫 a.out 的文件:

  gcc test.c

  你能用 -o 編譯選項來為將產生的可執行文件指定一個文件名來代替 a.out. 例如, 將一個叫 count.c 的 C 程序編譯為名叫 count 的可執行文件, 你將輸入下面的命令:

  gcc -o count count.c

---

--

注意: 當你使用 -o 選項時, -o 後面必須跟一個文件名.

---

--

  

  GCC 同樣有指定編譯器處理多少的編譯選項. -c 選項告訴 GCC 僅把原始碼編譯為目標代碼而跳過彙編和連接的步驟. 這個選項使用的非常頻繁因為它使得編譯多個 C 程序時速度更快並且更易於管理. 預設時 GCC 建立的目標代碼文件有一個 .o 的擴展名.

-S 編譯選項告訴 GCC 在為 C 代碼產生了彙編語言文件後停止編譯. GCC 產生的彙編語言文件的預設擴展名是 .s . -E 選項指示編譯器僅對輸入文件進行預處理. 當這個選項被使用時, 預處理器的輸出被送到標準輸出而不是儲存在文件裡.

  優化選項

  當你用 GCC 編譯 C 代碼時, 它會試著用最少的時間完成編譯並且使編譯後的代碼易於調試. 易於調試意味著編譯後的代碼與原始碼有同樣的執行次序, 編譯後的代碼沒有經過優化. 有很多選項可用於告訴 GCC 在耗費更多編譯時間和犧牲易調試性的基礎上產生更小

更快的可執行文件. 這些選項中最典型的是-O 和 -O2 選項.

  -O 選項告訴 GCC 對原始碼進行基本優化. 這些優化在大多數情況下都會使程序執行的更快. -O2 選項告訴 GCC 產生儘可能小和儘可能快的代碼. -O2 選項將使編譯的速度比使用 -O 時慢. 但通常產生的代碼執行速度會更快.

  除了 -O 和 -O2 優化選項外, 還有一些低級選項用於產生更快的代碼. 這些選項非常的特殊, 而且最好只有當你完全理解這些選項將會對編譯後的代碼產生什麼樣的效果時再去使用. 這些選項的詳細描述, 請參考 GCC 的指南頁, 在命令行上鍵入 man gcc .

  調試和剖析選項

  GCC 支持數種調試和剖析選項. 在這些選項裡你會最常用到的是 -g 和 -pg 選項.

-g 選項告訴 GCC 產生能被 GNU 調試器使用的調試信息以便調試你的程序. GCC 提供了一個很多其他 C 編譯器裡沒有的特性, 在 GCC 裡你能使 -g 和 -O (產生優化代碼)聯用.. 這一點非常有用因為你能在與最終產品儘可能相近的情況下調試你的代碼. 在你同時使用這兩個選項時你必須清楚你所寫的某些代碼已經在優化時被 GCC 作了改動. 關於調試

C 程序的更多信息請看下一節用 gdb 調試 C 程序 .

  -pg 選項告訴 GCC 在你的程序裡加入額外的代碼, 執行時, 產生 gprof 用的剖析信息以顯示你的程序的耗時情況. 關於 gprof 的更多信息請參考 gprof 一節.

  用 gdb 調試 GCC 程序

  Linux 包含了一個叫 gdb 的 GNU 調試程序. gdb 是一個用來調試 C 和 C++ 程序的強力調試器. 它使你能在程序運行時觀察程序的內部結構和內存的使用情況. 以下是 gdb 所提供的一些功能:

  它使你能監視你程序中變量的值.

  它使你能設置斷點以使程序在指定的代碼行上停止執行.

  它使你能一行行的執行你的代碼.

  在命令行上鍵入 gdb 並按回車鍵就可以運行 gdb 了, 如果一切正常的話, gdb 將被啟動  

  並且你將在屏幕上看到類似的內容:

  GNU gdb 5.0

  Copyright 2000 Free Software Foundation, Inc.

  GDB is free software, covered by the GNU General Public License, and you arewelcome to change   it and/or distribute copies of it under certain conditions.

  Type show copying to see the conditions.

  There is absolutely no warranty for GDB. Type show warranty for details.

  This GDB was configured as i386-redhat-linux.

(gdb)

  當你啟動 gdb 後, 你能在命令行上指定很多的選項. 你也可以以下面的方式來運行 gdb

:

  gdb fname>;

  當你用這種方式運行 gdb , 你能直接指定想要調試的程序. 這將告訴gdb 裝入名為 fname 的可執行文件. 你也可以用 gdb 去檢查一個因程序異常終止而產生的 core 文件,

或者與一個正在運行的程序相連. 你可以參考 gdb 指南頁或在命令行上鍵入 gdb -h 得到一個有關這些選項的說明的簡單列表.

  為調試編譯代碼(Compiling Code for Debugging)

  為了使 gdb 正常工作, 你必須使你的程序在編譯時包含調試信息. 調試信息包含你程序裡的每個變量的類型和在可執行文件裡的地址映射以及原始碼的行號. gdb 利用這些信息使原始碼和機器碼相關聯.

  在編譯時用 -g 選項打開調試選項.

  gdb 基本命令

  gdb 支持很多的命令使你能實現不同的功能. 這些命令從簡單的文件裝入到允許你檢查所調用的堆棧內容的複雜命令, 表27.1列出了你在用 gdb 調試時會用到的一些命令. 想了解 gdb 的詳細使用請參考 gdb 的指南頁.

  基本 gdb 命令.

  命 令 描 述

  file 裝入想要調試的可執行文件.

  kill 終止正在調試的程序.

  list 列出產生執行文件的原始碼的一部分.

  next 執行一行原始碼但不進入函數內部.

  step 執行一行原始碼而且進入函數內部.

  run 執行當前被調試的程序

  quit 終止 gdb

  watch 使你能監視一個變量的值而不管它何時被改變.

  print 顯示表達式的值

  break 在代碼裡設置斷點, 這將使程序執行到這裡時被掛起.

  make 使你能不退出 gdb 就可以重新產生可執行文件.

  shell 使你能不離開 gdb 就執行 UNIX shell 命令.

  gdb 支持很多與 UNIX shell 程序一樣的命令編輯特徵. 你能象在 bash 或 tcsh裡那樣按 Tab 鍵讓 gdb 幫你補齊一個唯一的命令, 如果不唯一的話 gdb 會列出所有匹配的命令. 你也能用光標鍵上下翻動歷史命令.

linux作業系統文章專題:linux作業系統詳解(linux不再難懂)

linux相關文章:linux教程


技術專區

相關焦點

  • 《嵌入式Linux應用程式開發標準教程》(第2版)
    編程基礎Linux下C編程基礎之:Linux下C語言編程概述Linux下C編程基礎之:常用編輯器Linux下C編程基礎之:gcc編譯器Linux下C編程基礎之:gdb調試器Linux下C編程基礎之:make工程管理器Linux下C編程基礎之:使用autotoolsLinux下C編程基礎之:實驗內容
  • Linux開發板上開機自動運行用戶應用程式
    開機後自動運行用戶的應用程式或啟動系統服務的命令保存在開發板根文件系統的/usr/etc/rc.local文件中。有的開發板開機後自動運行圖形界面程序,需要按住ctrl+c讓開發板進入到Linux的SHELL提示符界面。其實可通過注釋掉rc.local文件中調用圖形界面的命令,增加運行用戶應用程式的命令,達到開機自動運行用戶應用程式的目的。
  • 盤點Linux作業系統下C語言編程注意事項
    三、庫的學習  無論是在哪個平臺做軟體開發,對於庫的學習都很重要,linux下的開發庫很多,我主要介紹一下我常常用到的一些庫。  1、glib庫  glib 庫是gtk+和gnome的基礎庫,並具是跨平臺的,在linux、unix和windows下都可以用。
  • Linux下C編程基礎之:Linux下C語言編程概述
    C語言採用代碼及數據分隔,使程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便地調用,並具有多種循環、條件語句控制程序流向,從而使程序完全結構化。(3)C語言功能齊全。C語言具有各種各樣的數據類型,並引入了指針的概念,可使程序效率更高。
  • ARM Linux開機後自動運行特定程序的方法
    系統服務的命令保存在開發板根文件系統的/usr/etc/rc.local文件中。有的開發板開機後自動運行圖形界面程序,需要按住ctrl+c讓開發板進入到linux的SHELL提示符界面。
  • 加速程序開發 Python整合C語言模塊
    而作為軟體開發的傳統程式語言——C語言,卻能在這些問題上很好地彌補Python語言的不足。因此,本文通過實例研究如何在Python程序中整合既有的C語言模塊,包括用C語言編寫的源程序和動態連結庫等,從而充分發揮Python語言和C語言各自的優勢。Python語言的特點Python作為一門程序開發語言,被越來越多地運用到快速程序開發。
  • Linux下C/C++編譯器gcc使用簡介
    1.gcc包含的c/c++編譯器本文引用地址:http://www.eepw.com.cn/article/257973.htmgcc,cc與c++,g++gcc和cc是一樣的,c++和g++是一樣的。一般c程序就用gcc編譯,c++程序就用g++編譯。
  • 伺服器端開發經驗總結 Linux C語言
    我主要是在linux下進行C語言的開發,所以後面的實現都是基於Linux作業系統並用注意一下講解的所有內容都是基於32位系統的開發!伺服器程序開發核心是穩定,在穩定的前提下需要考慮效率。其中主要的公共模塊是內存池和線程池。
  • Linux環境下的USB攝像頭驅動開發
    本文從Linux內核的USB核心模塊出發,遵循Video4Linux接口標準,採用urb策略與內存映射的方式以提高數據讀取速度,設計開發了基於Linux環境下的USB攝像頭驅動,並在ARM9實驗平臺上對該驅動程序進行了測試與分析。
  • linux驅動開發第1講:帶你編寫一個最簡單的字符設備驅動
    今天,我們來看一個hello驅動,希望這是大家入門linux內核驅動的良好開局。我的環境是ubuntu 14.04,內核版本 4.4.0-31-generic,本節我會開發一個基於ubuntu 14.04下的最簡單的hello驅動,帶大家領略驅動的魅力。
  • linux驅動開發第2講:應用層的write如何調用到驅動中的write
    在linux作業系統中,一切皆是文件:文件是文件,目錄是文件,設備是文件,socket套接字是文件,管道也是文件。linux作業系統用文件抽象出了這一切,文件成為了以上這些實體的編程接口。正由於此,基於linux的編程變成了面向文件的編程,對於linux應用程式開發者而言,簡直是爽的不要不要的。但是,對於內核開發者而言,卻是未必。
  • HelloWorld背後的故事:在Linux上編譯C語言程序
    C語言的經典程序「Hello World」並不難寫,很多朋友都可以閉著眼將它寫出來。那麼編譯一個「Hello World」到底經歷了怎樣的過程呢?c0 60 04 40 00 mov    $0x400460,%r8 4003d6: 48 c7 c1 f0 03 40 00 mov    $0x4003f0,%rcx 4003dd: 48 c7 c7 a0 03 40 00 mov    $0x4003a0,%rdi 4003e4: e8 97 ff ff ff  
  • 物聯網開發筆記——嵌入式開發之Linux系統中C程序的編譯與調試
    了解熟悉工業自動化領域的,也開發過物聯網相關的產品。我的初衷是做工業物聯網的,但這個系統太過於龐大。所以就先做小的系統,例如構建一整套智能家居系統,從硬體到軟體全系列。下面就開始這套智能家居系統是如何在物聯網基礎上構建。在這裡你可以0開始,然後到1質變,僅僅需要一起跟我學物聯網系列的開發筆記的文章。
  • Linux下c++使用occi連接oracle11.2資料庫
    linux下c/c++連接oracle可以使用oci、occi、Pro*C/C++幾種方法:Oracle Call Interface (OCI) 是 Oracle Database 的全面、高性能、原生 C 語言接口,可用於開發自定義或打包資料庫應用。
  • 淺談Python程序和C程序的整合
    Python 語言與 C 語言的交互  為了節省軟體開發成本,軟體開發人員希望能夠縮短的軟體的開發時間,希望能夠在短時間內開發出穩定的產品。Python 功能強大,簡單易用,能夠快速開發應用軟體。但是由於 Python 自身執行速度的局限性,對性能要求比較高的模塊需要使用效率更高的程序語言進行開發,例如 C 語言,系統的其他模塊運用 Python 進行快速開發,最後將 C 語言開發的模塊與 Python 開發的模塊進行整合。在此背景下,基於 Python 語言與 C 語言的各自特點,用 C 語言來擴展現有的 Python 程序,顯得很有意義。
  • Linux系統下多線程程序編譯makefile文件
    在Linux下,編譯一個多線程的程序命令為:本文引用地址:http://www.eepw.com.cn/article/201609/305140.htmgcc -lpthread -o file file.c在Linux下,用交叉編譯器編譯一個在
  • 基於μCLinux的USB驅動程序實現
    在此介紹FTDI公司的USB晶片FT245BL的主要性能、工作原理,並將其應用在Blackfin ADSP-BF533微處理器的嵌入式開發平臺上,說明在μClinux下編寫與加載USB接口晶片FT245BL的驅動程序方法,實現了DSP主板的 USB埠通信。
  • Linux下C編程基礎之:gdb調試器
    如何提高程式設計師的調試效率,更好、更快地定位程序中的問題從而加快程序開發的進度,是大家都很關注的問題。就如讀者熟知的Windows下的一些調試工具,如VisualStudio自帶的設置斷點、單步跟蹤等,都受到了廣大用戶的讚賞。那麼,在Linux下有什麼很好的調試工具呢?gdb調試器是一款GNU開發組織並發布的UNIX/Linux下的程序調試工具。
  • Linux下C語言編程基礎知識
    這篇文章介紹在LINUX下進行C語言編程所需要的基礎知識。假設我們有下面一個非常簡單的源程序(hello.c): int main(int argc,char **argv) { printf("Hello Linux\n"); } 要編譯這個程序,我們只要在命令行下執行: gcc -o hello hello.c gcc 編譯器就會為我們生成一個hello的可執行文件。執行.
  • 「正點原子FPGA連載」第七章使用XSDK開發Linux應用
    Linux應用上一章我們成功使用Petalinux搭建了Linux系統,有了系統就可以在上面運行應用程式。本章我們以創建「Hello World」工程為例學習如何使用XSDK(Xilinx SDK)工具開發Linux應用並運行在我們上一章搭建好的Linux系統上。運行方式本章介紹了三種,可根據個人喜好選擇。