静态打桩位置与链接错误,有啥关联吗?
想看看静态链接的问题,写了几个函数:test.h,add.h,add.c,test.c文件,代码如下:test.h文件
程序代码:#ifndef __TEST_H__
#define __TEST_H__
#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */
extern int sub(int x, int y);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __TEST_H__ */add.h文件
程序代码:#include "test.h"
#ifndef __ADD_H__
#define __ADD_H__
#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */
extern int add(int x, int y);
#define DB 1
#ifdef DB
#define sub(x,y) add(x,y)
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __ADD_H__ */
add.c文件
程序代码:#include <stdio.h>
#include "add.h"
int add(int x, int y)
{
return (x+y);
}test.c文件
程序代码:#include <stdio.h>
#include "test.h"
#include "add.h"
int sub(int x, int y)
{
return (x-y);
}
int main(int argc, char *argv[])
{
int num = sub(5,3);
printf("%d",num);
for(;1<5;);
}
在编译链接后,会报链接错误add.obj : error LNK2005: _add 已经在 test.obj 中定义但是如果在add.c文件中去掉头文件#include “add.h”则编译链接是正确;
如果将add.h中如下代码
#define DB 1
#ifdef DB
#define sub(x,y) add(x,y)
#endif
放在test.c文件中,在sub函数定义的下方,则必须在add.c文件中包含#include "add.h"编译链接才正确。
请问这个是什么原因?






