1. 程式人生 > >Makefile,如何傳遞巨集定義DEBUG

Makefile,如何傳遞巨集定義DEBUG

1, gcc中使用巨集的例子:
在程式中,通過有這樣的程式碼段:   
#ifdef   DEBUG   
printf("Debug   is   define!\n");   
#endif   
printf("Hello   World!\n");   
希望在編譯時,傳遞DEBUG定義,實現Debug版本和Release版本的區別。   


gcc   -DDEBUG   -o   ttt   a.c   b.c   
gcc     -o   ttt   a.c   b.c

gcc   -UDEBUG   -o   ttt   a.c   b.c   是取消巨集定義


2, GNU Make

make是負責從專案的原始碼中生成最終可執行檔案和其他非原始碼檔案的工具。 make命令本身可帶有四種引數:標誌、巨集定義、描述檔名和目標檔名。

其標準形式為:make [flags] [macro definitions] [targets]

Unix系統下標誌位flags選項及其含義為:
-f file 指定file檔案為描述檔案,如果file引數為 '-' 符,那麼描述檔案指向標準輸入。如果沒有 '-f' 引數,則系統將預設當前目錄下名為makefile或者名為Makefile的檔案為描述檔案。在Linux中, GNU make 工具在當前工作目錄中按照GNUmakefile、makefile、Makefile的順序搜尋 makefile檔案。
-i 忽略命令執行返回的出錯資訊。
-s 沉默模式,在執行之前不輸出相應的命令列資訊。
-r 禁止使用隱含規則。

-n 非執行模式,輸出所有執行命令,但並不執行。
-t 更新目標檔案。
-q make操作將根據目標檔案是否已經更新返回"0"或非"0"的狀態資訊。
-p 輸出所有巨集定義和目標檔案描述。
-d Debug模式,輸出有關檔案和檢測時間的詳細資訊。


Linux下make標誌位的常用選項與Unix系統中稍有不同,下面只列出了不同部分:
-c dir 在讀取 makefile 之前改變到指定的目錄dir。
-I dir 當包含其他 makefile檔案時,利用該選項指定搜尋目錄。
-h help文擋,顯示所有的make選項。
-w 在處理 makefile 之前和之後,都顯示工作目錄。
通過命令列引數中的target ,可指定make要編譯的目標,並且允許同時定義編譯多個目標,操作時按照從左向右的順序依次編譯target選項中指定的目標檔案。如果命令列中沒有指定目標,則系統預設target指向描述檔案中第一個目標檔案。

2.1 make macro definitions

makefile如下:

  LIBES= -LS

# use macros rewrite makefile .. 

prog: $(OBJECTS)

cc $(OBJECTS) $(LIBES) -o prog

此時假如執行不帶引數的make命令,將連線三個目標文件和庫文件LS;但是假如在make命令後帶有新的巨集定義:

make "LIBES= -LL -LS"

命令列後面的巨集定義將覆蓋makefile文件中的巨集定義。若LL也是庫文件,此時make命令將連線三個目標文件連同兩個庫文件LS和LL。

 make local_all  "SW=SWM_DEBUG"

2.2  追加巨集定義

c file:

#ifdef  SWM_DEBUG
Tracker->Debug( "%s:%d:%s, none do  iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxiiiiiiiiiiiiiiiiiiiiiii\n",__FILE__, __LINE__,__FUNCTION__ );
#endif

Makefile file:

CPPFLAGS += -DDEBUG_MEMORY

CPPFLAGS += -DDEBUG_CLASS_NAMES

make 命令:

make local_all  "CPPFLAGS += -DSWM_DEBUG"

相關推薦

Makefile如何傳遞巨集定義DEBUG

1, gcc中使用巨集的例子:在程式中,通過有這樣的程式碼段:   #ifdef   DEBUG   printf("Debug   is   define!\n");   #endif   printf("Hello   World!\n");   希望在編譯時,傳遞DE

Makefile中進行巨集定義-D

在原始碼裡面如果這樣是定義的:#ifdef   MACRONAME//可選程式碼#endif那在makefile裡面gcc   -D   MACRONAME=MACRODEF或者gcc   -D   MACRONAME關鍵詞: Make巨集定義 Make傳遞巨集定義 Make

Makefile中用巨集定義進行條件編譯(gcc -D)/在Makefile中進行巨集定義-D

在原始碼裡面如果這樣是定義的: #ifdef   MACRONAME //可選程式碼 #endif 那在makefile裡面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   -D   MACRONAME  這樣就定義了預處理巨集,編譯的時候可選程式碼就會被編譯進去了。 對於G

例項說明makefile 能增加巨集定義

rm -rf test test.o ./test-add/test-add.o ./test-sub/test-sub.o gcc -Wall -std=gnu99 -DTEST_ADD -DTEST_SUB=1 -I./test-add -I./test-sub -o test.o -c test.c g

M/在Makefile中進行巨集定義-D

在原始碼裡面如果這樣是定義的: #ifdef   MACRONAME //可選程式碼 #endif 那在makefile裡面 gcc   -D   MACRONAME=MACRODEF 或者 gcc   -D   MACRONAME  這樣就定義了預處理巨集,編譯的時候可選程式碼就會被編譯進去了。 對於G

C語言中利用巨集定義一個字串和字元陣列定義的字串其末尾都會自動新增\0字元

#include <stdio.h> #define MYPHONE "AT+CMGS" unsigned char SMS[]="HELLO, WELCOME TO RCCTS!"; unsigned char *String; unsigned char i=0; void main() {

關於VS中區分debug與release32位與64位編譯的巨集定義

在vs程式設計中,常常涉及到32位和64位程式的編譯,怎麼判斷當前編譯是32位編譯還是64位編譯?如何判斷 是debug下編譯還是release下編譯?因為之前用到,這裡記錄一下,省的忘了又要瘋狂的google。 1.判斷是debug編譯還是release編譯。 如

Makefile使用-D選項更改巨集定義記得要clean

1、Makefile檔案,如下 CC_OPTS += -DMakefle_D=2 all:testD echo "done" testD:testD.c gcc testD.c -o testD $(CC_OPTS) 2、testD.c檔案,如下

巨集定義開關和debug printf巨集定義使用異或交換兩數

1、巨集定義開關和debug printf #define DEBUG_PRINT 1 #ifdef DEBUG_PRINT #define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\

RPC的發展歷史(本質就是雙方定義好協議傳遞參數後遠程調用)

ctu 代理 sock 異步調用 體系結構 大小 加密傳輸 性問題 文本 服務器通訊原理就是一臺socket服務器A,另一臺socket客戶端B,現在如果要通訊的話直接以流方式寫入或讀出。 這樣能實現通訊,但有個問題。如何知道更多信息?比如需要發送流大小,編碼,Ip等

lua裡實現類似巨集定義動態生成程式碼

其實就是用了  lua 的 loadstring 功能。 1.把需要動態生成的程式碼拼接成為一個字串。 str 2. loadstring(str)   這個只是解析了程式碼,相當於一個function   需要 執行一下才會生效

行內函數巨集定義記憶體對齊型別轉換

巨集 與 inline的區別 存在的價值,兩者都是文字替換,降低程式跳轉次數,提高效率 1. define 是預處理命令,無法除錯 ,最簡單文字替換,     inline 是編譯期替換,可以除錯, 存在引數型別檢查 2. 使用inline的時候,函式必須定義   直接定義的函式

【qt】訊號使用自定義的結構作為引數傳遞

錯誤   解決辦法: 方法1:註冊改向量 1、註冊位置:在第一次使用此類連結跨執行緒的signal/slot之前,一般在當前類的建構函式中進行註冊; 2、註冊方法:在當前類的頂部包含:#include <QMetaType>,建構函式中加入程

#define assert_param(expr) ((void)0) 這是個巨集定義(void)0執行的操作

問題:#define assert_param(expr) ((void)0) 這是個巨集定義,但是我真是不知道(void)0能執行什麼操作 具體的定義和用法在下面 void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset) { asse

C++:編寫跨平臺程式的關鍵C/C++中的內建巨集定義

得到的答案 都不好。為什麼,因為他們都不知道原理。其實原理很簡單,編譯器 引數或Makefile添加了巨集定義,你才可以這樣去判斷。 比如編譯器設定了巨集 is_windows,你才能去用。不設定沒法用。 但是,我敢肯定各種編譯器 內建一些巨集,比如 MS VC的cl.exe ,LIN

玩手遊神助攻:盤點那些具有遊戲巨集按鍵可自定義按鍵一鍵多用的模擬器

哪些安卓模擬器具有遊戲巨集按鍵?不要誤會,這裡說的巨集按鍵不是大家以為的WG,巨集按鍵功能是指:通過按鍵的編輯可以使某個按鍵執行多個操作。如在刺激戰場遊戲中,可以設定按下某個按鍵開啟地圖,鬆開該按鍵關閉地圖的功能。也可設定一個巨集按鍵,執行多個點選命令,按下此按鍵可在多個位置同時點選,達到一鍵多用的

define巨集定義中的###@#及\符號

一、# 名稱:字串化操作符 其作:將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。 使用條件:只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前 舉例: #define example1(instr) #instr string str=

GCC編譯時增加巨集定義-D識別符號相當於巨集定義#define 識別符號

GCC編譯時增加巨集定義-D<識別符號>,相當於#define <識別符號>,可以在遇到條件編譯時執行。 #ifdef <識別符號> //條件編譯內容 #

它被定義但它卻被定義為未定義——有趣的巨集定義

    前些日子為了弄清楚巨集定義寫了個小程式,忽然發現將識別符號定義為空和將識別符號定義為未定義完全是兩碼事……然後發現原來巨集定義中還有一種狀態叫“未定義”。下面就是那個小程式以及簡單的分析,然後通過這個程式可以充分體驗一下這個“未定義”的狀態,體驗一下什麼叫“它被定義了,但它卻被定義為未定義”。 程式

版本判別巨集定義使用

先丟出一個炸彈: #define kCurrentVersion [[[UIDevice currentDevice] systemVersion] intValue] #if kCurrentVersion >= 9 #endif 問題:inv