0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三個(gè)Makefile模板分享

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 2023-07-10 09:07 ? 次閱讀

本文分享三個(gè)Makefile模板:編譯可執(zhí)行程序、編譯靜態(tài)庫、編譯動態(tài)庫。

1 寫在前面

對于Windows下開發(fā),很多IDE都集成了編譯器,如Visual Studio,提供了“一鍵編譯”,編碼完成后只需一個(gè)操作即可完成編譯、鏈接、生成目標(biāo)文件。 Linux開發(fā)與Windows不同,Linux下一般用的的gcc/g++編譯器,如果是開發(fā)ARM下的Linux程序,還需用到arm-linux-gcc/arm-linux-g++交叉編譯器。 Linux下也可以實(shí)現(xiàn)“一鍵編譯”功能,此時(shí)需要一個(gè)編譯腳本“Makefile”,Makefile可以手動編寫,也可以借助自動化構(gòu)建工具(如scons、CMake)生成。手動編寫Makefile是Linux和Windows程序員的區(qū)別之一,一般地一個(gè)通用的Makefile能夠適合大部分Linux項(xiàng)目程序。

2 三個(gè)Makefile模板

2.1 編譯可執(zhí)行文件Makefile

4c9f703e-1e2f-11ee-962d-dac502259ad0.png【要點(diǎn)說明】 【1】程序版本 開發(fā)調(diào)試過程可能產(chǎn)生多個(gè)程序版本,可以在目標(biāo)文件后(前)增加版本號標(biāo)識。 4cbd840c-1e2f-11ee-962d-dac502259ad0.png ????【2】編譯器選擇 ????Linux下為gcc/g++;arm下為arm-linux-gcc;不同CPU廠商提供的定制交叉編譯器名稱可能不同,如Hisilicon“arm-hisiv300-linux-gcc”。 4cd55d16-1e2f-11ee-962d-dac502259ad0.png ????【3】宏定義 ????開發(fā)過程,特殊代碼一般增加宏條件來選擇是否編譯,如調(diào)試打印輸出代碼。-D是標(biāo)識,后面接著的是“宏”。 4cee1d60-1e2f-11ee-962d-dac502259ad0.png ????【4】編譯選項(xiàng) ????可以指定編譯條件,如顯示警告(-Wall),優(yōu)化等級(-O)。 4cfcb582-1e2f-11ee-962d-dac502259ad0.png ????【5】源文件 ????指定源文件目的路徑,利用“wildcard”獲取路徑下所有依賴源文件。 4d0b02e0-1e2f-11ee-962d-dac502259ad0.png ????【6】頭文件 ????包含依賴的頭文件,包括源碼文件和庫文件的頭文件。 4d19cb22-1e2f-11ee-962d-dac502259ad0.png ????【7】庫文件名稱 ????指定庫文件名稱,庫文件有固定格式,靜態(tài)庫為libxxx.a;動態(tài)庫為libxxx.so,指定庫文件名稱只需寫“xxx”部分, 4d33f8f8-1e2f-11ee-962d-dac502259ad0.png ????【8】庫文件路徑 ????指定依賴庫文件的存放路徑。注意如果引用的是動態(tài)庫,動態(tài)庫也許拷貝到“/lib”或者“/usr/lib”目錄下,執(zhí)行應(yīng)用程序時(shí),系統(tǒng)默認(rèn)在該文件下索引動態(tài)庫。 4d471d8e-1e2f-11ee-962d-dac502259ad0.png ????【9】目標(biāo)文件 ????調(diào)用“patsubst”將源文件(.c)編譯為目標(biāo)文件(.o)。 4d5b741e-1e2f-11ee-962d-dac502259ad0.png ????【10】執(zhí)行文件 ????執(zhí)行文件名稱 4d6d2646-1e2f-11ee-962d-dac502259ad0.png ????【11】編譯 4d80923a-1e2f-11ee-962d-dac502259ad0.png ????【12】鏈接 ????可創(chuàng)建一個(gè)“output”文件夾存放目標(biāo)執(zhí)行文件。鏈接完輸出目標(biāo)執(zhí)行文件,可以刪除編譯產(chǎn)生的臨時(shí)文件(.o)。 4d9c3cc4-1e2f-11ee-962d-dac502259ad0.png ????【13】清除編譯信息 ????執(zhí)行“make clean”清除編譯產(chǎn)生的臨時(shí)文件。 4db279e4-1e2f-11ee-962d-dac502259ad0.png

2.2 編譯靜態(tài)庫Makefile

4dc75b48-1e2f-11ee-962d-dac502259ad0.png【要點(diǎn)說明】 基本格式與“編譯可執(zhí)行Makefile”一致,不同點(diǎn)包括以下。 【1】使用到“ar”命令將目標(biāo)文件(.o)鏈接成靜態(tài)庫文件(.a)。靜態(tài)庫文件固定命名格式為:libxxx.a。

2.3 編譯動態(tài)庫Makefile

4dd70e1c-1e2f-11ee-962d-dac502259ad0.png【要點(diǎn)說明】 基本格式與“編譯可執(zhí)行Makefile”一致,不同點(diǎn)包括以下。 【1】編譯選項(xiàng)和鏈接選項(xiàng)增加“-fPIC -shared ”選項(xiàng)。動態(tài)庫文件固定命名格式為libxxx.so。

3 Demo

3.1 編譯應(yīng)用程序

編寫測試?yán)?,文件存放目錄結(jié)構(gòu)如下,頭文件存放在“include”目錄,庫文件存放在“l(fā)ib”目錄,源文件存放在“source”目錄,Makefile在當(dāng)前目錄下。 4defa666-1e2f-11ee-962d-dac502259ad0.jpg ????源碼1: 4e009b6a-1e2f-11ee-962d-dac502259ad0.png ????源碼2: 4e0f3418-1e2f-11ee-962d-dac502259ad0.png ????主函數(shù)源碼: 4e270c96-1e2f-11ee-962d-dac502259ad0.png ????庫文件,“./lib”目錄下存放兩個(gè)庫文件,一個(gè)靜態(tài)庫libfun_a.a,一個(gè)動態(tài)庫libfun_so.so。 ????Makefile文件即為“2.1節(jié)”的Makefile模板。 ????測試運(yùn)行: 4e3a121e-1e2f-11ee-962d-dac502259ad0.jpg

【如果執(zhí)行文件提示無“l(fā)ibfun_so.so”,則需拷貝“l(fā)ibfun_so.so”到根目錄下的“/lib”或者“/usr/lib”目錄下,因?yàn)橄到y(tǒng)執(zhí)行程序,默認(rèn)從該路徑引腳動態(tài)庫】

3.2 生成靜態(tài)庫

編寫測試?yán)?,生產(chǎn)的庫文件即為“3.1節(jié)”調(diào)用的庫文件(libfun_a.a)。文件存放目錄結(jié)構(gòu)如下: 4e564e66-1e2f-11ee-962d-dac502259ad0.png ????源文件: 4e6bab44-1e2f-11ee-962d-dac502259ad0.png ????Makefile文件即為“2.2節(jié)”的Makefile模板。 ????編譯生成靜態(tài)庫: 4e7f8236-1e2f-11ee-962d-dac502259ad0.png

3.3 生成動態(tài)庫

編寫測試?yán)?,生產(chǎn)的庫文件即為“3.1節(jié)”調(diào)用的庫文件(libfun_so.so)。文件存放目錄結(jié)構(gòu)如下: 4e9aa8fe-1e2f-11ee-962d-dac502259ad0.png ????源文件: 4eb1e3ac-1e2f-11ee-962d-dac502259ad0.png ????編譯生成動態(tài)庫: 4ec15a26-1e2f-11ee-962d-dac502259ad0.png 來源:https://blog.csdn.net/qq_20553613/article/details/90649734

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209523
  • 模板
    +關(guān)注

    關(guān)注

    0

    文章

    108

    瀏覽量

    20566
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49133

原文標(biāo)題:Linux下幾個(gè)Makefile通用模板

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    模板制造的三個(gè)主要技術(shù)是什么?有什么特點(diǎn)?

    模板制造的三個(gè)主要技術(shù)是什么?SMT模板的特點(diǎn)是什么?
    發(fā)表于 04-25 09:42

    如何鑒別/判斷可控硅的三個(gè)

    如何鑒別/判斷可控硅的三個(gè)極 鑒別可控硅三個(gè)
    發(fā)表于 07-16 22:35 ?1380次閱讀

    駕馭Makefile

    駕馭Makefile在網(wǎng)上你能找到很多關(guān)于Makefile的學(xué)習(xí)資料,但絕大部分給你的只是一個(gè)知識點(diǎn),與將Makefile運(yùn)用到項(xiàng)目中(尤其是大型項(xiàng)目)的差距非常的大。因?yàn)椋瑢?/div>
    發(fā)表于 01-05 17:05 ?9次下載

    makefile的基本語法

     在Makefile中,最重要的三個(gè)概念是:目標(biāo)(target)、依賴關(guān)系(dependency)和命令(command)。目標(biāo)是指要干什么,即運(yùn)行make后生成什么;依賴是指明目標(biāo)所依賴的其他目標(biāo);命令則告訴make如何生成目標(biāo),這
    發(fā)表于 11-12 10:15 ?1.1w次閱讀

    Makefile是什么?Makefile工作原理是怎樣的?Makefile經(jīng)典教程免費(fèi)下載

    Makefile的重要性 會不會寫makefile,從一個(gè)側(cè)面說明了一個(gè)人是否具備完成大型工程的能力 makefile帶來的好處就是——
    發(fā)表于 09-12 17:19 ?0次下載
    <b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎樣的?<b class='flag-5'>Makefile</b>經(jīng)典教程免費(fèi)下載

    Makefile的項(xiàng)目模板免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Makefile的項(xiàng)目模板免費(fèi)下載 可根據(jù)項(xiàng)目名稱修改。
    發(fā)表于 06-12 08:00 ?11次下載
    <b class='flag-5'>Makefile</b>的項(xiàng)目<b class='flag-5'>模板</b>免費(fèi)下載

    三個(gè)被動元件的基礎(chǔ)知識及應(yīng)用

    三個(gè)被動元件的基礎(chǔ)知識及應(yīng)用
    發(fā)表于 03-24 09:41 ?19次下載
    <b class='flag-5'>三個(gè)</b>被動元件的基礎(chǔ)知識及應(yīng)用

    pid控制三個(gè)參數(shù)怎么調(diào)整

    pid控制三個(gè)參數(shù)怎么調(diào)整?
    發(fā)表于 09-19 09:08 ?4.9w次閱讀

    個(gè)STM32編譯Makefile模板

    個(gè)STM32編譯Makefile模板
    發(fā)表于 11-13 20:06 ?10次下載
    一<b class='flag-5'>個(gè)</b>STM32編譯<b class='flag-5'>Makefile</b><b class='flag-5'>模板</b>

    AVR-GCC Makefile 中文翻譯

    所有的想要的功能都可以實(shí)現(xiàn)。但是我是個(gè)愛鉆牛角尖人,呵呵。看了一下 WINAVR Makefile模板我覺得寫得很好,學(xué)習(xí)了一下,翻譯了一下,加上很多我的理解和注釋。把它共享給大家,共同進(jìn)步。這個(gè)M...
    發(fā)表于 11-15 13:36 ?35次下載
    AVR-GCC <b class='flag-5'>Makefile</b> 中文翻譯

    個(gè)stm32的makefile分享

    寫在前面? 這是一個(gè)為stm32f103ze處理器寫的裸機(jī)工程的makefile,具有建立工程,編譯工程,下載hex文件到目標(biāo)板的功能。? 依賴于gcc-arm-none-eabi交叉編譯
    發(fā)表于 12-16 16:58 ?14次下載
    一<b class='flag-5'>個(gè)</b>stm32的<b class='flag-5'>makefile</b>分享

    Makefile】簡單實(shí)用的Makefile模板來了

    【Linux + Makefile】簡單實(shí)用的Makefile模板來了
    的頭像 發(fā)表于 08-31 12:46 ?1906次閱讀
    【<b class='flag-5'>Makefile</b>】簡單實(shí)用的<b class='flag-5'>Makefile</b><b class='flag-5'>模板</b>來了

    Makefile】通用模板

    對于上述這樣的多.c文件,又不在同一個(gè)目錄下的大型工程中,借助makefile可以來減輕工作任務(wù)
    的頭像 發(fā)表于 04-15 12:47 ?498次閱讀
    【<b class='flag-5'>Makefile</b>】通用<b class='flag-5'>模板</b>

    低溫?zé)Y(jié)銀的三個(gè)誤區(qū)

    低溫?zé)Y(jié)銀的三個(gè)誤區(qū)
    的頭像 發(fā)表于 09-17 11:54 ?6120次閱讀
    低溫?zé)Y(jié)銀的<b class='flag-5'>三個(gè)</b>誤區(qū)

    mosfet的三個(gè)電極怎么區(qū)分 mos管三個(gè)極電壓關(guān)系

    MOSFET(金屬氧化物半導(dǎo)體場效應(yīng)晶體管)有三個(gè)主要電極,分別是柵極(Gate)、漏極(Source)和源極(Drain)。這三個(gè)電極的區(qū)分方法如下
    的頭像 發(fā)表于 09-18 12:42 ?3.4w次閱讀