Linux學習筆記——例說makefile 增加宏定義

從學習C語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫一個makefile總覺得非常吃力。所以特意借助博客總結makefile的相關知識,通過例子說明makefile的具體用法。
??? 例說makefile分為以下幾個部分,更多內容請參考【例說makefile索引博文】
??? 1.只有單個C文件??
??? 2.含有多個C文件???
??? 3.需要包括頭文件路徑
??? 4.增加宏定義
??? 5.增加系統共享庫
??? 6.增加自定義共享庫
??? 7.一個實際的例子


??? 【代碼倉庫】——makefile-example
??? 代碼倉庫位于bitbucket,可借助TortoiseHg(GUI工具)克隆代碼或者在網頁中直接下載zip包。
??? 【本例說明】

??? 本例將說明makefile文件中如何加入宏定義。

?

1.gcc復習
??? 宏定義使用前綴-D,在編譯過程中可以把宏定義追加到CFLAG中。宏定義有兩種相似的寫法
??? 【第一種】-D DEFINES
??? 【第二種】-D DEFINES=CONDITION


2.源文件
??? 使用兩種不同的方式,通過宏定義包裹打印功能,分別使用#ifdef和#if

#include <stdio.h>
#include <test-add.h>
#include <test-sub.h>
int main(void)
{
??? int a = 3;
??? int b = 2;
??????
??? printf("a=%d\n", a);
??? printf("b=%d\n", b);
#ifdef TEST_ADD
??? printf("a+b=%d\n", add(a,b));
#endif
#if TEST_SUB
??? printf("a-b=%d\n", sub(a,b));
#endif
??? return 0;
}

3.makefile
??? 請替換其中的[tab],并以代碼倉庫中的makefile文件為主。

# 指令編譯器和選項
CC=gcc
CFLAGS=-Wall -std=gnu99
# 宏定義
DEFS = -DTEST_ADD -DTEST_SUB=1
CFLAGS += $(DEFS)
# 目標文件
???
TARGET=test
# 源文件
SRCS = test.c \
? ./test-add/test-add.c \
? ./test-sub/test-sub.c
# 頭文件查找路徑
INC = -I./test-add -I./test-sub
# 目標文件
OBJS = $(SRCS:.c=.o)
# 鏈接為可執行文件
$(TARGET):$(OBJS)
#?@echo TARGET:$@
#?@echo OBJECTS:$^
[tab]$(CC) -o $@ $^
clean:
[tab]rm -rf $(TARGET) $(OBJS)
# 連續動作,請清除再編譯鏈接,最后執行
exec:clean $(TARGET)
[tab]@echo 開始執行
[tab]./$(TARGET)
[tab]@echo 執行結束
# 編譯規則 $@代表目標文件 $< 代表第一個依賴文件
%.o:%.c
[tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<

4.具體說明

??? 【1】 makefile定義頭文件的方法有兩種

??? 【第一種】-D DEFINES

??? 【第二種】-D DEFINES=CONDITION


??? 【2】DEFS = -DTEST_ADD -DTEST_SUB=1
??? 為了說明問題,此處使用了兩種不同的寫法。此時兩處打印功能均被執行


??? 【3】CFLAGS += $(DEFS)
??? 追加到CFLAGS中,此處需要強調CFLAGS只是一個變量,可以命名為任何合法的名稱,只要在編譯過程中引用該參數即可。
??? $(CC) $(CFLAGS) $(INC) -o $@ -c $<

?

5.執行過程
??? 【編譯和鏈接】
??? make clean && make
??? 【控制臺輸出】
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
gcc -Wall -std=gnu99 -DTEST_ADD -DTEST_SUB=1 -I./test-add -I./test-sub -o test-add/test-add.o -c test-add/test-add.c
gcc -Wall -std=gnu99 -DTEST_ADD -DTEST_SUB=1 -I./test-add -I./test-sub -o test-sub/test-sub.o -c test-sub/test-sub.c
gcc -o test test.o test-add/test-add.o test-sub/test-sub.o
??? 從控制臺的輸出可以看出,在編譯過程中加入了-D參數。
??? 【執行】
a=3
b=2
a+b=5
a-b=1??? 最終效果和預期完全相同,makefile得到的驗證。


6.總結
??? 【1】增加宏定義的兩個方法 -D DEFINES? 和 -D DEFINES=CONDITION
??? 【2】宏定義追加到CFLAG之后

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252921.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android基本組件是什么?

1、ImageView繼承View組件,不單單用于顯示圖片,用 XML代碼 編寫的Drawable也可以顯示出來。其中的XML屬性 android:scaleType(設置圖片如何縮放或移動以適應ImageView的大小) 有很多的屬性值,如:matrix(使用矩形方式進行縮放)fitXY(對圖片橫向縱向縮放)center(圖片放在ImageVie…

Java 運算符及優先級

運算符 分割符&#xff1a;  ,  ;  []  ()算數運算符&#xff1a;    -  *  /  %    --關系運算符&#xff1a;  >  <  >  <    !邏輯運算符&#xff1a;  !  &  |  ^  &&  ||賦值運算符&#xff1a; …

array sort - 2 : quick sort

遞歸實現&#xff1a; #include <stdio.h>int arr[10] {3, 2, 4, 1, 9, 7, 5, 6, 0, 8};void print_array(){ int i 0; for (i 0; i < 10; i) printf("arr[%d]:%d ", i, arr[i]); printf("\n");}void swap(int *i, int *j){ …

Linux C 讀取文件夾下所有文件(包括子文件夾)的文件名

本文&#xff1a;http://www.cnblogs.com/xudong-bupt/p/3504442.html Linux C 下面讀取文件夾要用到結構體struct dirent&#xff0c;在頭#include <dirent.h>中&#xff0c;如下&#xff1a; #include <dirent.h> struct dirent {long d_ino; /* inode number 索…

報表工具實現單據套打

【摘要】 單據套打再也不用手動測量&#xff0c;反復調試了&#xff0c;報表工具實現單據套打&#xff0c;去乾學院看個究竟&#xff1a;報表工具實現單據套打!實際項目開發中&#xff0c;很多情況會涉及到單據的打印。即在一張印刷好的空白單據上&#xff0c;準確無誤地打印上…

每隔10秒鐘打印一個“Helloworld”

/*** 每隔10秒鐘打印一個“Helloworld”*/ public class Test03 {public static void main(String[] args) throws InterruptedException {ThreadImp threadImp new ThreadImp();Thread thread1 new Thread(threadImp);thread1.start();} }class ThreadImp extends Thread {p…

C++ STL 優先隊列

//優先隊列//Priority_queue //STL#include<iostream>#include<cstdio>#include<cstdlib>#include<queue>using namespace std;struct cmp{ bool operator() (const int a,const int b) const{//用const定義的a,b是包裹著變量外衣的常數&#xff0c;不…

GDB調試core文件樣例(如何定位Segment fault)

core dump又叫核心轉儲, 當程序運行過程中發生異常, 程序異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 叫core dump. (Linux中如果內存越界會收到SIGSEGV信號&#xff0c;然后就會core dump) 在程序運行的過程中&#xff0c;有的時候我們會遇到Segment fa…

管理信息系統的開發與管理

{% extendsmuban.html %} {% block head %}輸入{% endblock %} {% block main %} <div><div class"form-group"><label for"question">標題</label><textarea class"form-control" cols"50" rows"2&q…

python11-28筆記(1.6-1.7)

1.6 多類型傳值和冗余參數多類型傳值&#xff1a;比如def fun(x,y)&#xff0c;定義2個形參定義一個元組t(1,2),如果把元組當做實參傳入到函數中&#xff0c;會報錯 如何將元組當做不同類型的參數傳入到函數中fun(t) 代表傳入的是元組或者這樣調用fun((1,2))注意實參的個數要和…

session機制詳解以及session的相關應用

session是web開發里一個重要的概念&#xff0c;在大多數web應用里session都是被當做現成的東西&#xff0c;拿來就直接用&#xff0c;但是一些復雜的web應用里能拿來用的session已經滿足不了實際的需求&#xff0c;當碰到這樣的情況時候我們需要更加深入的理解session的機制&am…

(轉)Shell中獲取字符串長度的七種方法

Shell中獲取字符串長度的七種方法 原文&#xff1a;http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell腳本中很常用&#xff0c;下面歸納、匯總了求字符串的幾種可能方法: 【方法一】:利用${#str}來獲取字符串的長度 【方法二】:利用awk的length方…

linux下用core和gdb查詢出現段錯誤的地方

有些時候我們在一段C代碼的時候&#xff0c;由于對一個非法內存進行了操作&#xff0c;在程序運行的過程中&#xff0c;出現了"段錯誤"。呵呵&#xff0c;這種問題我想很多人會經常遇到。遇到這種問題是非常無語的&#xff0c;只是提示了"段錯誤"&#xff…

第一篇-Html標簽中head標簽,body標簽中input系列,textarea和select標簽

第十四周課程&#xff08;1-12章節&#xff09; HTML 裸體 CSS 穿華麗衣服 Javascript 動起來 一 HTML &#xff08;20個標簽&#xff09; 1.我們的瀏覽器是socket客戶端 2.一套規則&#xff0c;瀏覽器認識的規則 3.開發者&#xff1a; 學習html規則 開發后臺程序&#xff1a…

opencv3.2.0 Cmake 3.8.0 + tdm-gcc-5.1.0-3

實測 tdm-gcc-5.1.0-3 tdm32-1 32位版本無法正確編譯Opencv 3.2.0 會遇到諸多編譯問題 解決辦法 使用tdm-gcc-5.1.0-2 tdm64-1 64位版本轉載于:https://www.cnblogs.com/fundou/p/6710209.html

什么是商品屬性

一、什么是商品屬性&#xff1a; Definition of Product Attributes A product attribute is a characteristic that defines a particular product and will affect a consumers purchase decision. Product attributes can be tangible (or physical in nature) or intangibl…

linux用戶管理(1)----創建用戶(adduser和useradd)和刪除用戶(userdel)

arm linux的系統用戶管理&#xff1a; 1、刪除root用戶&#xff1a;deluser root2、刪除tt用戶:deluser tt3、建立root用戶&#xff1a;adduser root4、修改用戶密碼&#xff1a;登錄相應的用戶后&#xff0c;用passwd來修改密碼4、linux用戶和密碼的管理&#xff08;ftp&#…

前端性能優化之圖像優化原理

前端性能優化中&#xff0c;圖像的優化是非常重要的一環&#xff0c;為什么要說圖像的優化呢&#xff0c;而不是我們常見的圖片優化&#xff1f;因為這里的圖像包括矢量圖和位圖&#xff0c;我們常說的圖片優化是指位圖的優化。這篇文章轉載至奇舞周刊&#xff0c;大佬總結的非…

Lua開發學習4-普通循環和迭代器循環

說句實話&#xff0c;每當看到Lua代碼&#xff0c;我都感覺是半個SQL代碼&#xff0c;寫起來還是感覺有點恐怖。 while循環&#xff1a; 與C#的while循環類似&#xff0c;沒有什么好說的&#xff1b; --------Lua的while循環 while(condition)dostatementsend For循環 exp1為起…

什么是js的嚴格模式

設立嚴格模式的原因&#xff1a; - 消除Javascript語法的一些不合理、不嚴謹之處&#xff0c;減少一些怪異行為; - 消除代碼運行的一些不安全之處&#xff0c;保證代碼運行的安全&#xff1b; - 提高編譯器效率&#xff0c;增加運行速度&#xff1b; - 為未來新版本的Javascrip…