目錄
gcc條件編譯
myprogram.c代碼中:
#ifdef UMP_TO_FILE
//do something here...
#endif
gcc編譯時:
gcc myprogram.c -D UMP_TO_FILE
-D加上宏UMP_TO_FILE,相當於你在代碼中#define UMP_TO_FILE
-D UMP_TO_FILE = 1,相當於你在代碼中#define UMP_TO_FILE 1
-D name
Predefine name as a macro, with definition 1.
-D name=definition
The contents of definition are tokenized and processed as if they appeared during translation phase three in a #define directive. In particular, the definition will be truncated by embedded newline characters.
連接:https://www.it1352.com/784764.html
make 傳參
原文:https://blog.csdn.net/lala0903/article/details/111188228
需求:
在開發測試階段用debug版本,而上線發布用release版本。使用Makefile定制編譯不同版本,避免修改程序和Makefile文件。
過程:
比如,有一個test.cpp,包含這段代碼
#ifdef DEBUG
//your debug code
#endif
你希望在debug版本要執行your debug code,在release版本不執行your debug code。
我們可以寫這樣的一個Makefile:
ver = DEBUG #初值-默認值
ifeq ($(ver), DEBUG) #make ver=release的時候傳參
ALL: test_d
CXXFLAGS = -c -g -D DEBUG
else
ALL: test_r
CXXFLAGS = -c -O3
endif
test_d: test.do
g++ -o $@ $^
test_r: test.ro
g++ -o $@ $^
%.do: %.cpp
g++ $(CXXFLAGS) $< -o $@
%.ro: %.cpp
g++ $(CXXFLAGS) $< -o $@
Makefile執行時,首先判斷ver變量,如果ver的值是DEBUG,編譯DEBUG內的代碼,否則編譯RELEASE版。當然,默認情況下是編譯DEBUG版的。
如果想編譯RELEASE版,要怎么做?
只要在執行make時,對ver變量賦值,使得ver的值不為DEBUG,比如
# make ver=RELEASE
更多詳細定制:
https://blog.csdn.net/bandaoyu/article/details/83312151
https://blog.csdn.net/bandaoyu/article/details/89002912
在Makefile中使用
原文:https://blog.csdn.net/lala0903/article/details/111188228
代碼寫好之后有時候需要在編譯的時候選擇編譯哪部分代碼,通過gcc參數 -D給c文件傳遞宏參數,下面是具體實現,-D和參數中間空格可以省略
makefile參數傳遞,make para=value
例子:
myprint.c
#include <stdio.h>
#ifdef DEBUG
const char *g_vision = "宏參數是debug";
#else /* DEBUG */
const char *g_vision = "宏參數是relese";
#endif /* DEBUG */#if (FLAG == 1)
int g_flag = 1;
#else /* FLAG */
int g_flag = 0;
#endif /* FLAG */int main(int argc, char *argv[])
{
printf("%s, flag = %d\n", g_vision, g_flag);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
Makefile
OBJ=print
CC=gcc
VISION?=DEFAULT
INPUT?=0
$(OBJ):myprint.c
$(CC) -D $(VISION) -D FLAG=$(INPUT) $< -o $@
clean:
rm $(OBJ)
make的時候傳參:
make VISION=DEBUG INPUT=1
也可寫入腳本:build.sh
#!/bin/bash
read -p "腳本輸入測試,傳給c文件的flag為:" -t 10 temp
echo "輸入的參數值為 flag = ${temp}"
make VISION=${1} INPUT=${temp}
./print 參數1 參數2 參數3
make clean
執行腳本和傳參
lala0903@lala0903-virtual-machine:~/c_learn$ ./build.sh DEBUG
腳本輸入測試,傳給c文件的flag為:1
輸入的參數值為 flag = 1
gcc -D DEBUG -D FLAG=1 myprint.c -o print
宏參數是debug, flag = 1
argv[0] = ./print
argv[1] = 參數1
argv[2] = 參數2
argv[3] = 參數3
rm print
###################################################################
lala0903@lala0903-virtual-machine:~/c_learn$ ./build.sh RELESE
腳本輸入測試,傳給c文件的flag為:2
輸入的參數值為 flag = 2
gcc -D RELESE -D FLAG=2 myprint.c -o print
宏參數是relese, flag = 0
argv[0] = ./print
argv[1] = 參數1
argv[2] = 參數2
argv[3] = 參數3
rm print
其他高收藏文章:https://blog.csdn.net/maopig/article/details/7230311
宏定義的方式#ifdef和#if defined()比較
https://blog.csdn.net/bandaoyu/article/details/102689450