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來完成編譯,我們先看一個用於編譯和連結上面程式碼的例子:
從例子可以看出,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
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 $<
當然,還可以進一步簡化,有興趣可以再去研究下,這裡就不展示了。相關推薦
Linux下Makefile的編寫及四個特殊符號的意義@、<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="062246">[email160;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">[email160;protected]a>, $?
在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。 例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: [[email protected] /]$ ec
Makefile有三個非常有用的變數。分別是<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a480e4">[email160;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">[email160;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">[email160;protected]a>,$*,$$,$?代表的含義
$# :傳給指令碼的引數個數; $0 :指令碼名稱; $n :n為數字,代表傳給指令碼的第n個引數; [email protected] :引數列表; $* :也是顯示引數列表,與上一條命
makefile下$^,<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cbef8b">[email160;protected]a>,$?,$<,$(@D),$(@F)定義使用詳解
每次看makefile的時候,總會遇到一些變數記不住,就需要去查詢資料,今天有時間,就順便把幾個常用的變數學習了下,順便總結了下記憶方法,感覺記住它們並不難,特把方法分享給大家。變數定義:$^所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重複的,那個這個變數
Arch Linux 下Intel + NVIDIA 雙顯示卡3D 遊戲配置(<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="72161d06134032010617131f">[email160;
下午打了幾場dota2 感覺流暢度還算很不錯的,寫點東西記錄一下。用Arch Linux 的一般來說都會用搜索引擎,所以只說下需要注意的地方即可。 1. steam 自帶的OpenGL 庫是過時的,
makefile的特殊變數,類似<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0a2e4a">[email160;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">[email160;protected]a
前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949 特殊變數列表 變數 含義 $0 當前指令碼
面試題:一個字串包含英文和特殊字元,特殊字元不變,英文順序反過來,比如string str="<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2b4d0a4f5c6b">[email160
public class Reverse { public static void main(String[] args) { String str = "[email protected]!tk"; char[] chars = str.toCh
在linux中,$*和<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="90b4d0">[email160;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">[email160;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">[email160;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">[email160;protected]a>
用過終端登入遠端伺服器或者VPS的童鞋都用過類似的命令:ssh [email protected],輸入密碼後就可以登入遠端伺服器了,但是人總是懶滴,Here,免輸入密碼登入遠端伺服器的方法: 開啟終端,本地生成id_rsa(私鑰),id_rsa.pub(公
MacOS下git clone <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b8dfd1ccf8dfd1ccd0cdda96dbd7d5">[email160;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">[email160;
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">[email160;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">[email160;protected]a>@identity,該怎麼執行
@@identity是表示的是最近一次向具有identity屬性(即自增列)的表插入資料時對應的自增列的值,是系統定義的全域性變數。 一般系統定義的全域性變數都是以@@開頭,使用者自定義變數以@開頭。select @@identity,在access或sqlserver中