Makefile:条件编译
在源代碼里面如果這樣是定義的:?
#ifdef?? MACRONAME?
//可選代碼?
#endif?
那在makefile里面?
gcc?? -D?? MACRONAME=MACRODEF?
或者?
gcc?? -D?? MACRONAME?
這樣就定義了預處理宏,編譯的時候可選代碼就會被編譯進去了。?
對于GCC編譯器,有如下選項:?
??????? -D macro=string,等價于在頭文件中定義:#define?? macro?? string。例如:-D TRUE=true,等價于:#define?? TRUE?? true
??????? -D macro,等價于在頭文件中定義:#define?? macro?? 1,實際上也達到了定義:#define?? macro的目的。例如:-D LINUX,等價于:#define?? LINUX?? 1(與#define?? LINUX作用類似)。
??????? --define-macro?? macro=string與-D macro=string作用相同。?
如:?
TEST.C 文件 #include <stdio.h>#include <stdlib.h>main(){#ifdef p1 printf('Hello p1');#else printf('Hello p2');#endif }1.
編譯: gcc -o test test.c?
運行: ./test?
輸出: Hello p2?
2.?
編譯: gcc -o test test.c -D p1?
運行: ./test?
輸出: Hello p1?
?
還有另外一種使用方式:
Makefile寫法:
$(SERVER_NAME):$(SERVER_OBJ) $(COM_OBJS) $(CC) -Wall -pthread -D KRC_SERVER_NAME=$(SERVER_NAME)_FLAGC代碼中用法:
#if KRC_SERVER_NAME == krc_search_FLAG#elif KRC_SERVER_NAME == krc_feedback_FLAG#else#endif注意:其中的兩個參數為宏定義,不能使用常量定義,因為需要在預編譯階段就要確定其值!#define krc_search_FLAG 1#define krc_feedback_FLAG 2 這種用法也能實現條件編譯的作用,而且更好!總結
以上是生活随笔為你收集整理的Makefile:条件编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指定结构体字节对齐方式
- 下一篇: Shell 变量的作用域