电竞比分网-中国电竞赛事及体育赛事平台

分享

GNU make中文手冊-第一章:概述

 todaytomo 2006-12-30
GNU make中文手冊-第一章:概述 作者: hew  發(fā)布日期: 2006-3-21    查看數: 169   出自: http://www.
第一章:概述

1.1 make概述
Linux環(huán)境下的程序員如果不會使用GNU make來構建和管理自己的工程,應該不能算是一個合格的專業(yè)程序員,至少不能稱得上是Linux程序員。在Linux環(huán)境下使用GNU 的make工具能夠比較容易的構建一個屬于你自己的工程,整個工程的編譯只需要一個命令就可以完成編譯、連接以至于最后的執(zhí)行。不過這需要我們投入一些時 間去完成一個或者多個稱之為Makefile文件的編寫。此文件正是make正常工作的基礎。

所要完成的Makefile文件描述了整個工程的編譯、連接等規(guī)則。其中包括:工程中的哪些源文件需要編譯以及如何編譯、需要創(chuàng)建那些庫文件以及如何創(chuàng)建 這些庫文件、如何最后產生我們想要得可執(zhí)行文件。盡管看起來可能是很復雜的事情,但是為工程編寫Makefile的好處是能夠使用一行命令來完成“自動化 編譯”,一旦提供一個(多個)正確的Makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。

make是一個命令工具,它解釋Makefile中的指令(應該說是規(guī)則),Makefile中描述了工程中所有文件的編譯順序、規(guī)則。Makefile 有自己的書寫格式、關鍵字、函數。像C語言有自己的格式、關鍵字和函數一樣。而且在Makefile中可以使用shell所提供的任何命令來完成你想要的 工作。Makefile(在其它的系統(tǒng)上可能是另外的文件名)在絕大多數的IDE開發(fā)環(huán)境中都在使用,已經成為一種工程的編譯方法。

目前,系統(tǒng)完整的介紹make工具和如何編寫Makefile的中文文檔比較少。我整理這個文檔就是希望能使眾多的Linux環(huán)境下的程序員能夠比較容易 的掌握和學會使用它。本文所要介紹的是GNU的make,采用Red Hat FC3(包括最新發(fā)布的GNU Linux系統(tǒng))所集成的GUN make工具。

本文后續(xù)所用到的所有例子都采用C語言書寫的源程序,因為它是目前最普遍使用的一種語言。當然make工具不僅僅是用來管理C語言工程的,那些編譯器只要 能夠在shell下運行的語言所構建的工程都可以使用make工具來管理。而且也可以使用make工具來做一些其它的事。例如,有這樣的需求:當我們修改 了某個或者某些文件后,需要能夠根據修改的文件來自動對相關文件進行重建或者更新。那么應該考慮使用GNU make工具。GNU make工具為我們實現這個目的提供了非常有利的支持。工程中根據源文件的修改情況來進行代碼的編譯正是使用了make的這個特征。make執(zhí)行時,根據 Makefile的規(guī)則檢查文件的修改情況,決定是否執(zhí)行定義的動作(那些修改過的文件將會被重新編譯)。這是GNU make的執(zhí)行依據。



1.2 準備知識
在開始我們關于make的討論之前,首先需要明確一些基本概念:

編譯:把高級語言書寫的代碼轉換為機器可識別的機器指令。編譯高級語言后生成的指令雖然可被機器識別,但是還不能被執(zhí)行。編譯時,編譯器檢查高級語言的語 法、函數與變量的聲明是否正確。只有所有的語法正確、相關變量定義正確編譯器就可以編譯出中間目標文件。通常,一個高級語言的源文件都可對應一個目標文 件。目標文件在Linux中默認后綴為“.o”(如“foo.c”的目標文件為“foo.o”)。

為了和規(guī)則的目標文件相區(qū)別。本文將編譯高級語言后生成的目標文件成為.o文件。

鏈接:將多.o文件,或者.o文件和庫文件鏈接成為可被操作系統(tǒng)執(zhí)行的可執(zhí)行程序。鏈接器不檢查函數所在的源文件,只檢查所有.o文件中的定義的符號。 將.o文件中使用的函數和其它.o或者庫文件中的相關符號進行合并,最后生成一個可執(zhí)行的程序。“ld”是GNU的鏈接器。

靜態(tài)庫:又稱為文檔文件(Archive File)。它是多個.o文件的集合。Linux中靜態(tài)庫文件的后綴為“.a”。靜態(tài)庫中的各個成員(.o文件)沒有特殊的存在格式,僅僅是一個.o文件的集合。使用“ar”工具維護和管理靜態(tài)庫。

共享庫:也是多個.o文件的集合,但是這些.o文件時有編譯器按照一種特殊的方式生成。對象模塊的各個成員的地址(變量引用和函數調用)都是相對地址。因此在程序運行時,可動態(tài)加載庫文件和執(zhí)行共享的模塊(多個程序可以共享使用庫中的某一個模塊)。

參考 info ld了解更加詳細的關于ld的說明和用法。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多