1. 程式人生 > 其它 >將makefile中的巨集傳遞給原始碼

將makefile中的巨集傳遞給原始碼

前言:

今天遇到一個問題,在makefile中定義個巨集,巨集為一個字串,希望將該字串傳遞給程式碼。但是一直傳遞不過去,最後才找到原因,這裡小結一下。

直接上程式碼,makefile 如下:

 1 C_FLAGS := -DTEST_MACRO_HEHE="abcd1234"
 2  
 3 test: test.o
 4     gcc -o $@ $^
 5  
 6 test.o: test.c
 7     gcc $(C_FLAGS) -c -o $@ $< -Iinclude
 8  
 9 clean:
10     rm -f *.o
11     rm -f test

makefile 希望將巨集TEST_MACRO_HEHE傳遞到程式碼中。

來看下程式碼:

 1 #include <stdio.h>
 2  
 3  
 4 int main() {
 5     printf("---- main.\n");
 6  
 7 #ifdef TEST_MACRO_HEHE
 8     printf("==== TEST_MACRO_HEHE %s\n", TEST_MACRO_HEHE);
 9 #else
10     printf("==== not defined\n");
11 #endif
12  
13     return 0;
14 }

編譯的時候報錯:

 1 gcc -DTEST_MACRO_HEHE="
abcd1234" -c -o test.o test.c -Iinclude 2 test.c: In function ‘main’: 3 <command-line>:0:17: error: ‘abcd1234’ undeclared (first use in this function) 4 test.c:8:41: note: in expansion of macro ‘TEST_MACRO_HEHE’ 5 printf("==== TEST_MACRO_HEHE %s\n", TEST_MACRO_HEHE); 6 ^ 7
<command-line>:0:17: note: each undeclared identifier is reported only once for each function it appears in 8 test.c:8:41: note: in expansion of macro ‘TEST_MACRO_HEHE’ 9 printf("==== TEST_MACRO_HEHE %s\n", TEST_MACRO_HEHE); 10 ^ 11 Makefile:7: recipe for target 'test.o' failed 12 make: *** [test.o] Error 1

如果巨集定義為一個數字,例如12,這樣編譯是可以的,程式碼中也能識別該巨集。

但是,如果想要傳遞字串,在Makefile中需要注意,需要使用轉義,如下:

1 C_FLAGS := -DTEST_MACRO_HEHE=\"abcd1234\"
2 test: test.o
3     gcc -o $@ $^
4 test.o: test.c
5     gcc $(C_FLAGS) -c -o $@ $< -Iinclude
6 clean:
7     rm -f *.o
8     rm -f test

轉自:https://blog.csdn.net/shift_wwx/article/details/90673865