1. 程式人生 > >Makefile 學習日記(三)——makefile的瘦身

Makefile 學習日記(三)——makefile的瘦身

還是先看例子:

原料:main.c printfun.c methed.c 及其.h檔案
//main.c

#include "main.h"
void main()
{
        print_f();
        printf("\n%d+%d=%d\n",1,4,addfun(1,4));
}

//main.h

#include "stdio.h"
#include "printfun.h"
#include "methed.h"

//printfun.c

#include "printfun.h"
void print_f()
{
    printf("\nwelcom to learn Makefile!\n"
); }

//printfun.h

#include "stdio.h"
void print_f();

//methed.c

#include "methed.h"
int addfun(int a,int b)
{
    return a+b;
}
int minusfun(int a,int b)
{
       return a-b;
}

//methed.h

int addfun(int a,int b);
int minusfun(int a,int b);

Makefile檔案:

main:main.o printfun.o methed.o
        gcc -o main  *.o
clearn: rm -rf -v *.o main test: echo "test"

執行結果:

[[email protected] c3]# make
cc    -c -o main.o main.c
cc    -c -o printfun.o printfun.c
cc    -c -o methed.o methed.c
gcc -o main  *.o

總結如下:
1,是不是發現我寫的簡單了?對,我把能省的都省了,我就是想看看我省掉【預置條件1,2,3】後,makefile會怎麼辦。結果很好,他都會自己對響應的檔案進行編譯。
2,【cmd1】我使用了*.o,用這個的時候還出現過一點問題?
能不能在【預置條件1,2,3】裡使用呢?答案是不能的。

修改後的Makefile:

main:*.o
        gcc -o main  main.o printfun.o methed.o
clearn:
        rm -rf -v *.o main

test:
        echo "test"

執行結果:

[[email protected] c3]# make
cc    -c -o *.o printfun.c
gcc -o main  main.o printfun.o methed.o
gcc: error: main.o: No such file or directory
gcc: error: printfun.o: No such file or directory
gcc: error: methed.o: No such file or directory
gcc: fatal error: no input files
compilation terminated.
make: *** [main] Error 4

3,從列印結果看cc -c -o *.o printfun.c
*.o是被當做-o輸出的,也就是 *.o被整體當做一個【偽目標】,而不是一個通配的值。經過其他實驗發現每次都是 printfun.c 再編譯。需要高手解釋下啊。
4,我們可以看到假設我們的c檔案越來越多,我們要寫的【預置條件1,2,3,4….】也要越多。不合理啊。。。所以一定有方法讓我們簡化寫makefile的途徑
5,其實已經有一個途徑了,如在【cmd命令】中使用萬用字元*,但是千萬要注意萬用字元不能亂用,否則就會導致上面例子的錯誤。
6,那麼既然我們寫的不對Makefile就進行不下去,也就是說Makefile與其他的很多東西一樣是有規則要求的。
所以為了更快的寫Makefile,明天開始研究Makefile中的語法及規則。

相關推薦

Makefile 學習日記——makefile

還是先看例子: 原料:main.c printfun.c methed.c 及其.h檔案 //main.c #include "main.h" void main() { print_f(); printf("\n%

Makefile 學習日記——有標頭檔案的makefile

今天主要增加帶.h的編譯 ------------------------------------------------------------------ 原料:main.c  main.h  printfun.c printfun.h //main.c #includ

3ds Max學習日記

arc 操作 自己 https img 螺旋 沒有 hello 就是 ??今天把第三章搞完了,學的是樣條線(splines)建模的一些操作。不過實習又有新任務了,得去研究一下如何將單張圖片轉化為三維模型(我擦,這神馬操作),所以可能沒有那麽多時間愉快地與3ds max玩耍了

快速開發框架SpringBoot-學習日記

第2章 Spring Boot重要用法 Spring Boot中使用JSP頁面 步驟: 在src/main下建立webapp目錄 將webapp目錄指定的web資源目錄 匯入JSP引擎內建Tomcat的jasper<!--Sprin

Springboot學習日記自動裝配

Spring模式註解裝配 定義:一種用於宣告在應用中扮演“元件”角色的註解。 舉例:@Component、@Service、@Configuration 裝配:<context:component-scan>(Spring 2.5) @ComponentScan(Spring 3.0) 複製程式

python學習日記

        今天最後一次更新部落格,終於也學完了一天的東西了!開心!以後就每次學完就更新,不拖更!         最後一講主要是學了python的資料型別。雖然說在python裡面不像c一樣,需要加變數型別來宣

嵌入式學習日記

2018年11月08日 21:59:30 huyz_2008 閱讀數:12 個人分類: 嵌入式學習

numpy學習日記

numpy裡要分清有哪些方法獲得的陣列是原始陣列的檢視,這樣的陣列它們共享了同一個資料記憶體,修改其中一個數組內的元素,另外的也會發生變化 獲取素組序列有兩種方法 1:使用整數序列存取元素 使用下標獲取元素 使用此方法獲得的陣列將

Spring學習日記搭建MVC基本開發環境

一、準備工作 1、新建web project 2、新增spring開發支援       此時會自動配置上web包,其中包含了springMVC支援。也就是說可以直接在專案中使用Spring MVC了 3、定義相關配置 (1)Spring MVC的所有配置都要在a

VBS學習日記 執行外部程式

利用 Vbs 執行外部程式 Vbs 只提供了程式設計的一個基本框架,使用者可以使用 Vbs 來定義變數、過程和函式, vbs 也提供了一些內部函式和物件,但是 Vbs 沒有提供任何命令來訪問 Windows 系統內部的部件,但是值得慶幸的是,Vbs 雖然不能自己完成這些任務

JavaWeb學習日記

DTD語法(要求不高,不要求寫,要求會讀) 兩種寫法 引入中寫的:SYSTEM,表示當前的DTD檔案是本地的 如果寫的是:PUBLIC,則表示引入的DTD檔案是來自於網路的 在XML內部 <?xml version="1.0" encodi

Unity3D學習日記貝塞爾曲線

這裡有很多小夥伴可能不知道啥事貝塞爾曲線是啥玩意,如果你用過PS的鋼筆功能就知道這是啥,如果還是不知道這是啥那麼說一個遊戲你就知道了“憤怒的小鳥”這個遊戲用到彈弓效果可以用這個貝塞爾曲線來實現。還不知道的話拿自己去百度谷歌,這個是遊戲很常用到的一個畫曲線的函式方式。 那麼我

linux makefile學習筆記1

二、一個示例 正如前面所說的,如果一個工程有3個頭檔案,和8個C檔案,我們為了完成前面所述的那三個規則,我們的Makefile應該是下面的這個樣子的。 edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.occ -

linux makefile學習筆記4

四、巢狀執行make 在一些大的工程中,我們會把我們不同模組或是不同功能的原始檔放在不同的目錄中,我們可以在每個目錄中都書寫一個該目錄的Makefile,這有利於讓我們的Makefile變得更加地簡潔,而不至於把所有的東西全部寫在一個Makefile中,這樣會很難維護我們的Makefile,這個技術對於我們模

linux makefile學習筆記5

五、定義模式規則 你可以使用模式規則來定義一個隱含規則。一個模式規則就好像一個一般的規則,只是在規則中,目標的定義需要有"%"字元。"%"的意思是表示一個或多個任意字元。在依賴目標中同樣可以使用"%",只是依賴目標中的"%"的取值,取決於其目標。 有一點需要注意的是,"%"的展開發生在變數和函式的展開之後,變

Windows平臺下Makefile學習筆記

作者:朱金燦        上次我們學習了怎麼用Makefile編譯一個控制檯工程。這次我們學習一下如何使用Makefile來編譯一個win 32的GUI程式。win 32的GUI程式其編譯過程大部分和控制檯程式一樣,不同的是多了一步RC編譯器將資原始檔編譯成re

Makefile學習筆記

undefined reference to 'pthread_create' undefined reference to 'pthread_join' 問題原因: pthread 庫不是 Linux 系統預設的庫,連線時需要使用靜態庫 libpthread.a,

Linux學習日記

linux 命令 對於Linux新手來說,要想入門必先打好基礎,而Linux的命令就是這基礎中的重中之重。 首先學習了幫助命令Man的使用,Man可以查看命令的作用以及可用參數。並且如何去看幫助文檔中的內容NAME 使用命令的名稱 SYNOPSIS 命令參數的大致使用方法EXAMP

JAVA學習筆記

byte repl efi ber 時間 clas 區分大小寫 增強for size @SuppressWarnings("resource")是用來壓制資源泄露警告的。比如使用io類,最後沒有關閉。Set集合特點:1)無序,不隨機2)元素唯一3)沒下標註意:Collect

React學習小結

color render pro sed nbsp 合數 白雪 方式 內部 一、React數據的傳輸 1、屬性和狀態是react中數據傳遞的載體 2、屬性是聲明以後不允許被修改的東西 3、屬性只能在組件初始化的時候聲明並傳入組件內部,並且在組件內部通過this.props