在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux程序的編寫、編譯、調試方法及make

C語言專家集中營 ? 來源:未知 ? 作者:李倩 ? 2018-07-16 17:02 ? 次閱讀

1.建一個目錄

2.寫代碼,建一個hello.c文件

代碼:

< class="ViewSource" rel="nofollow" style="box-sizing: border-box;outline: 0px;color: rgb(103, 149, 181);background-image: url("https://mmbiz.qpic.cn/mmbiz_png/Yd5A7Cl21m4hiccZ4QpuUnPUuM8EQpfZdian4CriaHPzV0bXhbvnwoFkwHlKSoWRzRgxMERFP3oCtJxZz7icsLhIhQ/640?wx_fmt=gif");background-position: left top;background-size: initial;background-repeat: no-repeat;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: inherit;border-width: initial;border-style: none;border-color: initial;padding: 1px;margin-right: 10px;word-break: break-all;display: inline-block;width: 16px;height: 16px;text-indent: -2000px;" target="_self" title="view plain">view plain< class="CopyToClipboard" rel="nofollow" style="box-sizing: border-box;outline: 0px;color: rgb(103, 149, 181);background-image: url("https://mmbiz.qpic.cn/mmbiz_png/Yd5A7Cl21m4hiccZ4QpuUnPUuM8EQpfZdAbOXa8oicYJW4EAmgLUH0SNj4v9wju4KzA76TP9yPJhEgxr0uX4icBIg/640?wx_fmt=gif");background-position: left top;background-size: initial;background-repeat: no-repeat;background-attachment: initial;background-origin: initial;background-clip: initial;background-color: inherit;border-width: initial;border-style: none;border-color: initial;padding: 1px;margin-right: 10px;word-break: break-all;display: inline-block;width: 16px;height: 16px;text-indent: -2000px;" target="_self" title="copy to clipboard">copy to clipboard

#include"stdio.h"

main()

{

printf("HelloLinux.\n")

}

#include"stdio.h"

main()

{

printf("Hello Linux.\n")

}

記得最后一定要換行

3.編譯

gcc-ohellohello.c

使用gcc編譯器就會為我們生成一個hello的可執行文件

4.輸出

執行./hello就可以看到程序的輸出結果了.

是不是很簡單?

命令行中gcc表示我們是用gcc來編譯我們的源程序,-o選項表示我們要求編譯器給我們輸出的可執行文件名為hello而hello.c是我們的源程序文件.gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了.-o選項我們已經知道了,表示我們要求輸出的可執行文件名.-c選項表示我們只要求編譯器輸出目標代碼,而不必要輸出可執行文件.-g選項表示我們要求編譯器在編譯的時候提供我們以后對程序進行調試的信息.知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程序了,如果你想要知道更多的選項,可以查看gcc的幫助文檔,那里有著許多對其它選項的詳細說明.

下面我們來演示怎樣用GDB來調試一個求0+1+2+3+…+99的程序:

/* Filename:hello.c */
#include "stdio.h"main(){int i, sum;sum = 0;for (i = 0; i < 100; i++){sum + = i;}printf("the sum of 1+2+...+ is %d", sum);}

執行如下命令編譯hello.c(加-g選項產生debug信息):#gcc –g –ohello sum.c在命令行上鍵入gdb hello并按回車鍵就可以開始調試sum了,再運行run命令執行sum

#gdb hello

list命令用于列出源代碼,對上述程序兩次運行list,將出現如上畫面(源代碼被標行號)。

根據列出的源程序,如果我們將斷點設置在第5行,只需在gdb 命令行提示符下鍵入如下命令設置斷點:(gdb) break 5

設置斷點的另一種語法是 break ,它在進入指定函數(function)時停住。相反的,clear用于清除所有的已定義的斷點,clear 清除設置在函數上的斷點, clear 則清除設置在指定行上的斷點。watch命令:watch命令用于觀查變量或表達式的值,我們觀查sum變量只需要運行watch sum

watch 為表達式(變量)expr設置一個觀察點,一量表達式值有變化時,程序會停止執行。要觀查當前設置的watch,可以使用info watchpoints命令。next、step命令:next、step用于單步執行,在執行的過程中,被watch變量的變化情況將實時呈現(分別顯示Old value和New value)

next、step命令的區別在于step遇到函數調用,會跳轉到到該函數定義的開始行去執行,而next則不進入到函數內部,它把函數調用語句當作一條普通語句執行。

5.Make

make是所有想在Linux系統上編程的用戶必須掌握的工具,對于任何稍具規模的程序,我們都會使用到make,幾乎可以說不使用make的程序不具備任何實用價值。

在此,我們有必要解釋編譯和連接的區別。編譯器使用源碼文件來產生某種形式的目標文件(object files),在編譯過程中,外部的符號參考并沒有被解釋或替換(即外部全局變量和函數并沒有被找到)。因此,在編譯階段所報的錯誤一般都是語法錯誤。而連接器則用于連接目標文件和程序包,生成一個可執行程序。在連接階段,一個目標文件中對別的文件中的符號的參考被解釋,如果有符號不能找到,會報告連接錯誤。

編譯和連接的一般步驟是:第一階段把源文件一個一個的編譯成目標文件,第二階段把所有的目標文件加上需要的程序包連接成一個可執行文件。這樣的過程很痛苦,我們需要使用大量的gcc命令。

而make則使我們從大量源文件的編譯和連接工作中解放出來,綜合為一步完成。GNU Make的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件(目的文件,目的文件不一定是最后的可執行程序,它可以是任何一種文件)由哪些文件(依靠文件)產生,用什么命令來產生。Make依靠此makefile中的信息檢查磁盤上的文件,如果目的文件的創建或修改時間比它的一個依靠文件舊的話,make就執行相應的命令,以便更新目的文件。

假設我們寫下如下的三個文件,add.h用于聲明add函數,add.c提供兩個整數相加的函數體,而main.c中調用add函數:

/* filename:add.h */extern int add(int i, int j);/* filename:add.c */int add(int i, int j){return i + j;}/* filename:main.c */#include "add.h"main(){int a, b;a = 2;b = 3;printf("the sum of a+b is %d", add(a + b));}

怎樣為上述三個文件產生makefile呢?如下:

test : main.o add.ogcc main.o add.o -o testmain.o : main.c add.hgcc -c main.c -o main.oadd.o : add.c add.hgcc -c add.c -o add.o

上述makefile利用add.c和add.h文件執行gcc -c add.c -o add.o命令產生add.o目標代碼,利用main.c和add.h文件執行gcc -c main.c -o main.o命令產生main.o目標代碼,最后利用main.o和add.o文件(兩個模塊的目標代碼)執行gcc main.o add.o -o test命令產生可執行文件test。我們可在makefile中加入變量,另外。環境變量在make過程中也被解釋成make的變量。這些變量是大小寫敏感的,一般使用大寫字母。Make變量可以做很多事情,例如:i) 存儲一個文件名列表;ii) 存儲可執行文件名;iii) 存儲編譯器選項。要定義一個變量,只需要在一行的開始寫下這個變量的名字,后面跟一個=號,再跟變量的值。引用變量的方法是寫一個$符號,后面跟(變量名)。我們把前面的 makefile 利用變量重寫一遍(并假設使用-Wall -O –g編譯選項):

OBJS = main.o add.oCC = gccCFLAGS = -Wall -O -gtest : $(OBJS)$(CC) $(OBJS) -o testmain.o : main.c add.h$(CC) $(CFLAGS) -c main.c -o main.oadd.o : add.c add.h$(CC) $(CFLAGS) -c add.c -o add.o

makefile 中還可定義清除(clean)目標,可用來清除編譯過程中產生的中間文件,例如在上述makefile文件中添加下列代碼:

clean:rm -f *.o

運行make clean時,將執行rm -f *.o命令,刪除所有編譯過程中產生的中間文件。

不管怎么說,自己動手編寫makefile仍然是很復雜和煩瑣的,而且很容易出錯。因此,GNU也為我們提供了Automake和Autoconf來輔助快速自動產生makefile,讀者可以參閱相關資料。

7.小結

本章主要闡述了Linux程序的編寫、編譯、調試方法及make,實際上就是引導讀者學習怎樣在Linux下編程,為后續章節做好準備。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140467
  • 函數
    +關注

    關注

    3

    文章

    4371

    瀏覽量

    64229
  • 編譯器
    +關注

    關注

    1

    文章

    1656

    瀏覽量

    49900

原文標題:Linux下用C語言最基本的程序開發與調試

文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式Linux編譯調試

    【嵌入式Linux編譯調試】VisualStdio+VisualGDB在嵌入式Linux開發中,常見的方式是通過sourceinsight編輯程序
    發表于 11-04 09:04

    Linux設備驅動程序調試方法

    由于設備驅動程序運行于內核空間,因此有著與用戶空間程序不同的調試方法。 設備驅動程序調試需要內
    發表于 03-19 15:00 ?254次下載

    Linux系統網絡驅動程序編寫

    驅動程序編寫 一.Linux系統設備驅動程序概述 1.1 Linux設備驅動程序分類 1.2
    發表于 11-07 10:40 ?0次下載

    Linux的GNU Make中文手冊資料免費下載

    Linux 環境下的程序員如果不會使用 GNU make 來構建和管理自己的工程,應該不能算是一個合格的專業程序員,至少不能稱得上是 Unix 程序
    發表于 06-03 08:00 ?9次下載
    <b class='flag-5'>Linux</b>的GNU <b class='flag-5'>Make</b>中文手冊資料免費下載

    Linux下如何編譯C程序

    少量文件時可以使用上面方法編譯。源碼文件較多時,可借用make工具。make通過解析Makefile文件來執行一些gcc命令進行編譯
    的頭像 發表于 09-20 10:56 ?4621次閱讀
    <b class='flag-5'>Linux</b>下如何<b class='flag-5'>編譯</b>C<b class='flag-5'>程序</b>?

    【嵌入式Linux編譯調試---1---】VisualStdio+VisualGDB

    【嵌入式Linux編譯調試】VisualStdio+VisualGDB 在嵌入式Linux開發中,常見的方式是通過sourceinsight編輯程序
    發表于 11-01 17:38 ?8次下載
    【嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>編譯</b><b class='flag-5'>調試</b>---1---】VisualStdio+VisualGDB

    嵌入式Linux--配置gdb調試環境

    一、獲取arm-linux-gdbarm-linux-gdb屬于調試程序,主機可以通過執行該程序開啟在線調試。一開始照著網上的教程來操作,.configure、
    發表于 11-02 14:21 ?11次下載
    嵌入式<b class='flag-5'>Linux</b>--配置gdb<b class='flag-5'>調試</b>環境

    stm32cubeMX+vscode開發編譯調試stm32程序

    stm32cubeMX+vscode開發編譯調試stm32程序安裝vscode安裝make工具安裝交叉編譯工具鏈安裝openocd安裝cla
    發表于 12-24 19:31 ?6次下載
    stm32cubeMX+vscode開發<b class='flag-5'>編譯</b><b class='flag-5'>調試</b>stm32<b class='flag-5'>程序</b>

    hypervisor的調試分析方法

    我們在編寫裸機程序(baremetal)、虛擬化管理程序(hypervisor)和操作系統(OS)時,Debug分析程序是必不可少的。不像linux
    的頭像 發表于 10-08 09:40 ?1693次閱讀

    Linux使用gcc編譯程序的語法

    01. 調試相關的宏 在Linux使用gcc編譯程序的時候,對于調試的語句還具有一些特殊的語法。 gcc編譯的過程中,會生成一些宏,可以使用
    的頭像 發表于 06-22 10:51 ?993次閱讀

    Linux交叉編譯選項與源碼與目標文件分離

    交叉編譯選項 編譯Linux,通常只需要運行 make menuconfig 配置要編譯的模塊,然后運行
    的頭像 發表于 09-27 11:48 ?1137次閱讀

    Linux內核編譯腳本

    獲得編譯命令及選項 編譯linux時,默認不會顯示編譯的命令,如果你要獲得編譯命令及其選項,可以在mak
    的頭像 發表于 09-27 11:52 ?851次閱讀

    虛擬機linux怎么編寫程序

    虛擬機Linux編寫程序,包括設置虛擬機、選擇編程工具、創建和編輯代碼、編譯和運行程序等等。讓我們開始吧! 第一部分:設置虛擬機 在開始編寫程序
    的頭像 發表于 11-17 10:08 ?2281次閱讀

    makemake all和make clean的使用方法

    剛接觸Linux,認為直接make后就完成了編譯,沒想到編譯出的結果存在很大問題,原來是makemak
    的頭像 發表于 01-05 12:32 ?2517次閱讀

    linux驅動程序編譯方法是什么

    Linux驅動程序編譯方法主要包括兩種: 與內核一起編譯編譯成獨立的內核模塊 。以下是對
    的頭像 發表于 08-30 14:46 ?1125次閱讀
    主站蜘蛛池模板: 人人精品久久 | 欧美一级片网址 | www.一区二区 | 成年人污视频 | 2019偷偷狠狠的日日 | 天天做夜夜做 | 手机在线你懂的 | 亚洲三级电影在线播放 | 亚洲视频精品 | 尤物蜜芽福利国产污在线观看 | 美女喷白浆 | 亚洲免费一 | 一级午夜免费视频 | 奇米影视7777久久精品 | 四虎影院永久在线 | 亚洲午夜免费视频 | 久久精品国产夜色 | 91成人免费视频 | 在线视频午夜 | 天天干狠狠操 | 曰曰摸天天摸人人看久久久 | 欧美成人免费大片888 | 我要色综合网 | 午夜剧场官网 | 欧美黄色片免费看 | 日韩毛片视频 | 天天好比网 | 欧美成人免费大片888 | 久久综合狠狠综合久久综合88 | 狠狠干天天色 | 亚洲天堂一区二区三区 | 天天做天天看夜夜爽毛片 | 亚洲国产美女精品久久 | 国产亚洲一区二区在线观看 | 免费人成网站永久 | 影音先锋色偷偷米奇四色 | 特级毛片aaaaaa蜜桃 | 亚洲天堂成人在线 | 777丰满影院 | 国产成人精品日本亚洲网站 | 热久久国产|