当前位置: 技术问答>linux和unix
makefile,因为宏定义函数无法自动检测改变的情况.
来源: 互联网 发布时间:2016-08-19
本文导语: 不知道是我操作有问题还是makefile的bug,现在拿来大家一起看下这问题,大家也可以测试下: 1.首先我们准备三个测试文件,我把代码贴出来: test.h #define LOG_TYPE 2 ...
不知道是我操作有问题还是makefile的bug,现在拿来大家一起看下这问题,大家也可以测试下:
1.首先我们准备三个测试文件,我把代码贴出来:
test.h
#define LOG_TYPE 2 //输出类型设置
#if(LOG_TYPE == 1) //1是输出到标准输出口
#define PRINTF(fmt, args ...) printf(fmt, ##args)
#endif
#if(LOG_TYPE == 2) //2忽略调试信息输出
#define PRINTF(fmt, args ...)
#endif
void test(void);
void test2(void);
test.c
#include
#include "test.h"
#if(LOG_TYPE == 1)
#define LOG_F(fmt, args ...) printf(fmt, ##args)
#endif
#if(LOG_TYPE == 2)
#define LOG_F(fmt, args ...)
#endif
void test(void)
{
PRINTF("test PF n");
LOG_F("test LOG_F n");
}
void test2(void)
{
#if(LOG_TYPE == 1)
printf("test2 n");
#endif
#if(LOG_TYPE == 2)
#endif
}
main.c
#include
#include "test.h"
int main(void)
{
PRINTF("main !!n");
test();
test2();
}
Makefile
all:test
test:test.o main.o
gcc -o test test.o main.o
test.o:test.c test.h
gcc -c test.c -o test.o
main.o:main.c
gcc -c main.c -o main.o
clean:
rm -f test.o main.o test
现在我们操作test.h文件中的宏LOG_TYPE:
1.设置LOG_TYPE = 1->make->./test 输出:
main !!
test PF
test LOG_F
test2
2.设置LOG_TYPE = 2->make->./test 输出:
main !!
注意按道理来说我们设置LOG_TYPE = 2就不应该在有输出main!!!的.
这说明函数连接的还是连接到上一个版本的test.o文件,这里为什么没有连接到最新的.o文件谁能分析下吗?
除非你全部make clean在make才不会发生这样的情况.
1.首先我们准备三个测试文件,我把代码贴出来:
test.h
#define LOG_TYPE 2 //输出类型设置
#if(LOG_TYPE == 1) //1是输出到标准输出口
#define PRINTF(fmt, args ...) printf(fmt, ##args)
#endif
#if(LOG_TYPE == 2) //2忽略调试信息输出
#define PRINTF(fmt, args ...)
#endif
void test(void);
void test2(void);
test.c
#include
#include "test.h"
#if(LOG_TYPE == 1)
#define LOG_F(fmt, args ...) printf(fmt, ##args)
#endif
#if(LOG_TYPE == 2)
#define LOG_F(fmt, args ...)
#endif
void test(void)
{
PRINTF("test PF n");
LOG_F("test LOG_F n");
}
void test2(void)
{
#if(LOG_TYPE == 1)
printf("test2 n");
#endif
#if(LOG_TYPE == 2)
#endif
}
main.c
#include
#include "test.h"
int main(void)
{
PRINTF("main !!n");
test();
test2();
}
Makefile
all:test
test:test.o main.o
gcc -o test test.o main.o
test.o:test.c test.h
gcc -c test.c -o test.o
main.o:main.c
gcc -c main.c -o main.o
clean:
rm -f test.o main.o test
现在我们操作test.h文件中的宏LOG_TYPE:
1.设置LOG_TYPE = 1->make->./test 输出:
main !!
test PF
test LOG_F
test2
2.设置LOG_TYPE = 2->make->./test 输出:
main !!
注意按道理来说我们设置LOG_TYPE = 2就不应该在有输出main!!!的.
这说明函数连接的还是连接到上一个版本的test.o文件,这里为什么没有连接到最新的.o文件谁能分析下吗?
除非你全部make clean在make才不会发生这样的情况.
|
|
但还有一个错误就是单独执行make depend
会出现一个错误:make: Nothing to be done for `depend'.
-----------------------------
我不是很会makefile 这个不能算是错误吧
你去下载任意一个软件 直接就来一句make depend 也会出错的
make: *** ターゲット `depend' を make するルールがありません. 中止.
会出现一个错误:make: Nothing to be done for `depend'.
-----------------------------
我不是很会makefile 这个不能算是错误吧
你去下载任意一个软件 直接就来一句make depend 也会出错的
make: *** ターゲット `depend' を make するルールがありません. 中止.