没有过多的解释,只是给自己一个提示:
main函数:
- #include <stdio.h>
- #include "test2.h"
- //#define TEST_DEFINE_1
- #ifdef DEBUG
- #define ct_http_print(fmt, ...) do { printf("%s %s, %d:" fmt, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
- } while(0)
- #else
- #define ct_http_print(fmt, ...) do {} while(0)
- #endif
- #ifdef TEST
- void print_test_define_1(){
- printf("TEST_DEFINE_1 is defined!\n");
- return;
- }
- #else
- void print_test_define_1(){
- return;
- }
- #endif
- int main() {
- char s[] = "test string!\n";
- print_test_define_1();
- ct_http_print("hello, world, this is test of DEBUG define! string: %s\n", s);
- print2("hello test2");
- return 0;
- }
test2.h
- #ifndef __TEST2_H__
- #define __TEST2_H__
- #include <stdio.h>
- #include <stdlib.h>
- void print2(const char* str);
- #endif
test2.c
- #include <stdio.h>
- #include "test2.h"
- void print2(const char* str)
- {
- printf("TEST2: string : %s", str);
- }
先从最简单的Makefile开始吧
假设main源文件中得define都是被注释掉,makefile如下:
- main:main.o test2.o
- gcc -Wall -g main.o test2.o -o main
- main.o:mian.c
- gcc -Wall -g -c main.c -o main.o
- test2.o:test2.c test2.h
- gcc -Wall -g -c test2.c -o test2.o
- clean:
- rm -rf *.o main
现在在最简单的makefile上进行修改,利用makefile的内嵌变量
- main:main.o test2.o
- gcc -Wall -g $+ -o $@
- main.o:main.c
- gcc -Wall -g -c $< -o $@
- test2.o:test2.c test2.h
- gcc -Wall -g -c $< -o $@
- clean:
- rm -rf *.o main
在上面的Makefile基础上再进行修改,自己声明变量,这里只替换一部分,你也可以多定义几个变量把所有的全部替换:
- EXE=main
- OBJS=main.o test2.o
- $(EXE):$(OBJS)
- gcc -Wall -g $+ -o $@
- main.o:main.c
- gcc -Wall -g -c $< -o $@
- test2.o:test2.c test2.h
- gcc -Wall -g -c $< -o $@
- clean:
- rm -rf *.o main
下面还是在上面makefile的基础上修改,用到makefile的静态模式
- EXE=main
- OBJS=main.o test2.o
- $(EXE):$(OBJS)
- gcc -Wall -g $< -o $@
- objs:$(OBJS)
- %.o:%.c
- gcc -Wall -g -c $< -o $@
- clean:
- rm -rf *.o main
注意上面的Makefile是不正确的,它会报错,但是你把第五行的
$<换成
$+或者
$(OBJS)就可以了,为什么呢?我猜想的是$<仅代表一个依赖,所以在编译的时候没能把后面test2.o加进去,导致错误。
下面把所有的全部换成变量:
- EXE=main
- CC = gcc
- CFLAGS = -Wall
- OBJS=test2.o main.o
- $(EXE):$(OBJS)
- $(CC) $(MY_CFLAGS) $(CFLAGS) $+ -o $@
- objs:$(OBJS)
- %.o:%.c
- $(CC) $(MY_CFLAGS) $(CFLAGS) -c $< -o $@
- clean:
- rm -rf *.o main
这是在注释了main函数的define的makefile。那么现在来一个完整的Makefile
- EXE=main
- CC = gcc
- CFLAGS = -Wall
- MY_CFLAGS =
- DEBUG =
- TD =
- OBJS=test2.o main.o
- ifdef DEBUG
- MY_CFLAGS += -g -DDEBUG
- else
- MY_CFLLAGS += -g -O2
- endif
- ifdef TD
- MY_CFLAGS += -DTEST
- endif
- $(EXE):$(OBJS)
- $(CC) $(MY_CFLAGS) $(CFLAGS) $+ -o $@
- objs:$(OBJS)
- %.o:%.c
- $(CC) $(MY_CFLAGS) $(CFLAGS) -c $< -o $@
- clean:
- rm -rf *.o main
- 注意MY_CFLAGS=DTEST不要少了D
输入make时就要加入:make TD=1 DEBUG=1这样才能是main函数的define生效
阅读(1356) | 评论(0) | 转发(1) |