makefile 裡的 eval 函式
函式原型 $(eval text)
它的意思是 text 的內容將作為makefile的一部分而被make解析和執行。
比如這樣一個makefile:
$(eval xd:xd.c a.c)
將會產生一個這樣的編譯
cc xd.c a.c -o xd
這樣一個makefile:
define MA
aa:aa.c
gcc -g -o aa aa.c
endef
$(eval $(call MA) )
會產生一個這樣的編譯:
gcc -g -o aa aa.c
這樣的makefile:
OBJ=a.o b.o c.o d.o main.o
define MA
main:$(OBJ)
gcc -g -o main $$(OBJ)
endef
$(eval $(call MA) )
會產生這樣的編譯過程:
cc -c -o a.o a.c
cc -c -o b.o b.c
cc -c -o c.o c.c
g++ -c -o d.o d.cpp
cc -c -o main.o main.c
gcc -g -o main a.o b.o c.o d.o main.o
請注意到$$(OBJ) ,因為make要把這個作為makefile的一行,要讓這個地方出現$,就要用兩個$,因為兩個$,make才把把作為$字元。
Gnu make manual裡面舉了一個例子:
PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol
# Everything after this is generic
.PHONY: all
all: $(PROGRAMS)
define PROGRAM_template
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o
clean:
rm -f $(ALL_OBJS) $(PROGRAMS)
首先我認為$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o [email protected]
這一句好像是多餘的,本來在foreach 裡要定義server和client的依賴物件,然後套用預設的規則來編譯目標,我在cygwin+make3.8 下不把這個註釋掉會編譯不過。
註釋掉之後可以很好的產生 server.exe 和 client.exe。
我的理解是這樣
foreach 從 PROGRAMS 依次取出 server和client
對於server 在call之後會得到:
server:$$(server_OBJS) $$(server_LIBS:%=-l%)
經過eval之後將相當於makefile裡有這麼一行:
server:$(server_OBJS) $(server_LIBS:%=-l%)
make執行時按照變數替換原則相當於這麼一行:
server:server.o server_priv.o server_access.o -lpriv -lprotocol
所以make就會先編譯這些.o檔案,然後priv 和protocol 連線成server.exe
在這個makefile的基礎上我寫了一些簡單的c檔案來測試和學習。
相關推薦
makefile 裡的 eval 函式
函式原型 $(eval text) 它的意思是 text 的內容將作為makefile的一部分而被make解析和執行。 比如這樣一個makefile: $(eval xd:xd.c a.c) 將會產生一個這樣的編譯 cc xd.c a.c -o xd 這樣一個make
Makefile中的eval()函式用法
在一個論壇上找到了一個簡單易懂的解釋方法,我就不自己解釋了。 參考連結為: 點我 其實他的作用有點相當於c++中的模板,就是生成一個段makefile語句,然後還要被執行。 在參考連結中的示例程式,一開始我覺得這樣寫能執行嗎?直到我真正在自己的電腦上編輯完
php eval 函式
http://php.net/eval //獲取user_id 內的id的值 // $user['user_id'] = ' "id" => "123454321" '; eval('$user_id_arr = array(' .$user['user_id']. ');')
Python_從零開始學習_(46) eval 函式
eval() 函式十分強大 ---- 將字串 當成 有效的表示式 來求職 並 返回計算結果 # 基本的數學計算 print(eval("1 + 1")) # 2 # 字串重複 print(eval("'*' * 5")) # ***** # 將字串轉換成列表 print(eval("[1
python中eval函式作用
eval函式就是實現list、dict、tuple與str之間的轉化str函式把list,dict,tuple轉為為字串一、字串轉換成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a)print(type(
js裡的函式
js中的函式 函式是一段可以重複呼叫的程式碼塊,也是一個物件,為了解決程式碼重複的問題。 函式的5種宣告方式 1.具名函式 function f(x,y){ return x+y } 這裡function的作用相當於var,var用來宣告一個變數,而func
Opencv基礎: Mat類裡setTo函式詳解
https://blog.csdn.net/oMoDao1/article/details/80324360 函式原型: /** @brief Sets all or some of the array elements to the specified value. &n
make之makefile 七 使用函式
在Makefile中能夠使用函式來處理變數,從而讓我們的命令或是規則更為的靈活和具有智慧。make所支援的函式也不算非常多,只是已經足夠我們的操作了。函式呼叫後,函式的返回值能夠當做變數來使用。 一、函式的呼叫語法 函式呼叫,非常像變數的使用,也是以“$”來標識的,其語法例如以下:
C++裡宣告函式原型的作用
#include <iostream> #include <cmath> using namespace std; // 這個宣告函式原型的程式碼必須有, 如果沒有的話會報use of undeclared identifier 'simon' 這個異常 void simo
vue如何在websocket方法內獲取data裡的資料和method裡的函式
在實踐中,會發現在websocket的onmessage方法內處理資料時,從websocket得到的資料無法在其他函式內呼叫,其他變數和函式也無法在websocket裡使用,這是因為資料的作用域不同使得無法訪問。 我們可以進行如下修改 func() {
eval()函式 python eval() Python:eval的妙用和濫用
eval()函式十分強大,官方demo解釋為:將字串str當成有效的表示式來求值並返回計算結果。 so,結合math當成一個計算器很好用。 其他用法,可以把list,tuple,dict和string相互轉化。 見下例子: a = "[[1,2], [3,4], [5,6], [7,8], [9
Python中eval函式的作用
eval函式就是實現list、dict、tuple與str之間的轉化 str函式把list,dict,tuple轉為為字串 # 字串轉換成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a) print(b)
Makefile中常用函式
Makefile常用函式總結 1、realpath 返回一個絕對路徑 例:ROOT = $(realpath ./) 返回當前路徑的絕對地址,賦值給ROOT 2、wildcard 萬用字元函式,類似於linux中的 “*” 命令格式: $(
python中的EVAL函式的定義和用法!
https://blog.csdn.net/weixin_42859280/article/details/84673079 Python 內建函式 Python 內建函式 描述: eval() 函式用來執行一個字串表示式,並返回表示式的值。 以下是 eval() 方法的語法:
python eval 函式
eval()函式用處 在工作中我們經常會用到eval(),我總結了eval一下幾種用處: 功能 :eval函式可以將一個字串當成一個有效的表示式並返回結果 引數:有一下引數 source:一個Python表示式或函式compile()返回的程式碼物件
python-eval函式
一、基本用法 eval(expression, globals=None, locals=None) eval 最直接的作用就是把字串當成有效的表示式來求值並返回計算結果。 如下: a = 1 b
makefile-變數與 函式的綜合示例
變數與函式的綜合示例 1.專案需求 自動生成target資料夾存放可執行檔案 自動生成objs資料夾存放編譯生成的目標檔案(*.o) 支援除錯版本的編譯選項 考慮程式碼的擴充套件性 2. 關鍵語法 $(wildcard _pattern) 獲取當前工作
bytes型別轉字串 字典字串之間的轉換 eval 函式
一、bytes 型別 轉 字串: str = bytes資料.decode() 二、字串型別的字典轉成字典 先匯入json模組 import json dict = json.loads(str) 三、字典轉成字串型別 s
Vue學習日誌第二天 v-model 資料雙向繫結 eval函式用法
<div id="app"> <p> {{msg}}</p> <p><input type="text" v-b
【6】基礎知識類---eval函式及其安全性問題
eval()函式及其安全性問題 1.主要用途 a. 型別轉換:字串轉為列表、字典、元組 b. 做計算器使用 # 舉例1:型別轉換:字串轉為列表、字典、元組 mylist = '[1,2,3,4,[5,6,7,8,9]]' mydict = "{'a':12