1. 程式人生 > >Linux下Makefile的編寫及四個特殊符號的意義@、[email protected]、$^、$

Linux下Makefile的編寫及四個特殊符號的意義@、[email protected]、$^、$

我們先看三段C++程式:

一、line1的原始碼

line1.h

#ifndef _LINE_1_H 
#define _LINE_1_H 
	void line1_print(const char *strMsg);
#endif

line1.cpp
#include "line1.h"
#include <stdio.h>
void line1_print(const char *strMsg)
{
	printf("This is line1 print %s.\r\n",strMsg);
}

二、line2的原始碼

line2.h

#ifndef _LINE_2_H 
#define _LINE_2_H 
	void line2_print(const char *strMsg);
#endif

line2.cpp

#include "line2.h"
#include <stdio.h>
void line2_print(const char *strMsg)
{
	printf("This is line2 print %s.\r\n",strMsg);
}

三、main的原始碼

main.cpp

#include "line1.h"
#include "line2.h"

int main(int argc,char **argv)
{
	line1_print("hello runfarther");
	line2_print("hello runfarther");
	
	return 0;
}

對上面的程式碼,在不用Makefile時,我們可以直接用命令列來編譯,得到我們的可執行程式main.out:
g++ -c main.c 
g++ -c line1.c 
g++ -c line2.c 
g++ -o main.out main.o line1.o line2.o

為了編譯工作更加方便,我們通常會編寫Makefile來完成編譯,我們先看一個用於編譯和連結上面程式碼的例子:

main.out:main.o line1.o line2.o
	g++ -o main.out main.o line1.o line2.o
main.o:main.c line1.h line2.h
	g++ -c main.c
line1.o:line1.c line1.h
	g++ -c line1.c
line2.o:line2.c line2.h
	g++ -c line2.c
從例子可以看出,Makefile一般的格式是:
target:components 
	rule
第一行表示的是依賴關係,第二行是規則,特別要注意,rule這行必須是TAB鍵開頭。

比如說我們上面的那個Makefile檔案的前面二行:

main.out:main.o line1.o line2.o
    g++ -o main.out main.o line1.o line2.o
表示我們的目標(target)main.out的依賴物件(components)是main.o line1.o line2.o,當依賴的物件在被修改的話,就要去執行規則一行所指定的命令g++ -o main.out main.o line1.o line2.o。注意規則這行是以一個TAB鍵開頭。

接下來我來介紹下Makefile中的四個有用的特殊符號意義和使用,他們分別是@、[email protected]、$^、$<

一、@

這個符串通常用在“規則”行中,表示不顯示命令本身,而只顯示它的結果,例如Makefile中的內容為:

DIR_OBJ=./obj
CMD_MKOBJDIR=if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi

mkobjdir:
	@${CMD_MKOBJDIR}
命令列執行如下:
make mkobjdir
此時不會顯示在命令列不會顯示出if [ -d ${DIR_OBJ} ]; then exit 0; else mkdir ${DIR_OBJ}; fi,但如果規則行的TAB後沒有以@開頭,則會顯示,不信可以試試。

二、[email protected]、$^、$<

這三個分別表示:

[email protected]          --代表目標檔案(target)

$^            --代表所有的依賴檔案(components)

$<           --代表第一個依賴檔案(components中最左邊的那個)。

好了,知道了他們的意義後,如果使用上面三個變數,那麼簡化的Makefile檔案為:

main.out:main.o line1.o line2.o
	g++ -o [email protected] $^
main.o:main.c line1.h line2.h
	g++ -c $<
line1.o:line1.c line1.h
	g++ -c $<
line2.o:line2.c line2.h
	g++ -c $<
當然,還可以進一步簡化,有興趣可以再去研究下,這裡就不展示了。

相關推薦

LinuxMakefile編寫特殊符號意義@<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="062246">[email&#160;protected]a>$^$

我們先看三段C++程式: 一、line1的原始碼 line1.h #ifndef _LINE_1_H #define _LINE_1_H void line1_print(const char *strMsg); #endif line1.cpp #includ

linux bash Shell特殊變數:Shell $0, $#, $*, <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8aaeca">[email&#160;protected]a>, $?

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: [[email protected] /]$ ec

Makefile有三非常有用的變數。分別是<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a480e4">[email&#160;protected]a>,$^,$

原文地址:https://blog.csdn.net/u013774102/article/details/79043559 假設我們有下面這樣的一個程式,原始碼如下:  /* main.c */ #include "mytool1.h" #include "mytool2.h" i

【Shell】linux bash Shell特殊變數:Shell $0, $#, $*, <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4f6b0f">[email&#160;protected]<

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949

Linux$#,$0,$1,$2,$3,<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bc98fc">[email&#160;protected]a>,$*,$$,$?代表的含義

$# :傳給指令碼的引數個數; $0 :指令碼名稱; $n :n為數字,代表傳給指令碼的第n個引數; [email protected] :引數列表; $* :也是顯示引數列表,與上一條命

makefile$^,<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cbef8b">[email&#160;protected]a>,$?,$<,$(@D),$(@F)定義使用詳解

    每次看makefile的時候,總會遇到一些變數記不住,就需要去查詢資料,今天有時間,就順便把幾個常用的變數學習了下,順便總結了下記憶方法,感覺記住它們並不難,特把方法分享給大家。變數定義:$^所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那個這個變數

Arch Linux Intel + NVIDIA 雙顯示卡3D 遊戲配置(<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="72161d06134032010617131f">[email&#160;

下午打了幾場dota2 感覺流暢度還算很不錯的,寫點東西記錄一下。用Arch Linux 的一般來說都會用搜索引擎,所以只說下需要注意的地方即可。 1. steam 自帶的OpenGL 庫是過時的,

makefile特殊變數,類似<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0a2e4a">[email&#160;protected]a>, $+等 (copied)

來源:http://hi.baidu.com/jingweiyoung/item/dea74399c40eb24cf14215cf Makefile 特殊變數 常用特殊變數 例: %.o:%.c           ¥(CC) -c $(CFLAGS) $&l

Linux之Shell學習(三)Shell特殊變數:Shell $0, $#, $*, <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="321672">[email&#160;protected]a

前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949 特殊變數列表 變數 含義 $0 當前指令碼

linux中,$*和<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="90b4d0">[email&#160;protected]a>有什麼區別?

看了很多的文章,依然似懂非懂。現在,終於理解了它們兩者之間的區別。 $*會把當前指令碼的所有引數作為一個引數傳遞給子指令碼。(在英文中,*字元有“所有”的意思) [email protected]會把當前指令碼的所有引數分別作為一個引數傳遞給子指令碼。(在英文中,@字元有“獨立”的

kafka 消費者優化配置詳解 <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4c3f3c3e25222b2e232338670c072d2a272d00253f382922293e">[email

自定義屬性和執行工廠 public KafkaListenerContainerFactory<?> batchFactory(){ ConcurrentKafkaListenerContainerFactory<Integer, Stri

makefile 萬用字元瞭解% <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c4e084">[email&#160;protected]a> $^ $<

把目錄下所有檔案都編譯的命令。 1 all:$(subst .c,.o,$(wildcard *.c)) 2 3 %.o:%.c 4 gcc -o [email protected] $<    下面是幾個特舒符號的意思:   [email 

linux中,$*和<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="250165">[email&#160;protected]a>有什麼區別?

看了很多的相關文章,似懂非懂。現在,終於真正理解了它們兩者之間的區別。 首先我們看如下一個bash命令: ./start.sh "a b" "c" "d" 請問,給start.sh指令碼傳遞了幾個引數? 大部分人都知道,總共傳遞了3個引數,其中,$1等於a b,$2等

ssh-keygen配合~/.ssh/config免密碼<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="bacfc9dfc8fad2d5c9ce">[email&#160;protected]a>

用過終端登入遠端伺服器或者VPS的童鞋都用過類似的命令:ssh [email protected],輸入密碼後就可以登入遠端伺服器了,但是人總是懶滴,Here,免輸入密碼登入遠端伺服器的方法: 開啟終端,本地生成id_rsa(私鑰),id_rsa.pub(公

MacOSgit clone <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b8dfd1ccf8dfd1ccd0cdda96dbd7d5">[email&#160;protected]a>: P

MacOS下git clone [email protected]: Permission denied (publickey)錯誤及解決方式 前言 錯誤訊息 解決辦法 改用git當使用者名稱 檢查是否有使用key

linux備忘筆記】Linux root 從bash-3.2回到<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8af8e5e5fecae6e5e9ebe6e2e5f9fe">[email&#160;

1.進入目錄 cd /etc/skel 2.顯示隱藏檔案 ls -a   .bash_logout  .bash_profile  .bashrc  拷貝這些隱藏檔案到/home  接

淺談linux中shell變數$#,<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="674327">[email&#160;protected]a>,$0,$1,$2,$?的含義解釋

淺談linux中shell變數$#,[email protected],$0,$1,$2,$?的含義解釋 下面小編就為大家帶來一篇淺談linux中shell變數$#,[email protected],$0,$1,$2的含義解釋。小編覺得挺不錯的,現在就分享給大家,

sql語句中有insert然後有<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4330262f26203703">[email&#160;protected]a>@identity,該怎麼執行

@@identity是表示的是最近一次向具有identity屬性(即自增列)的表插入資料時對應的自增列的值,是系統定義的全域性變數。 一般系統定義的全域性變數都是以@@開頭,使用者自定義變數以@開頭。select @@identity,在access或sqlserver中