静态打桩位置与链接错误,有啥关联吗?
想看看静态链接的问题,写了几个函数: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"编译链接才正确。
请问这个是什么原因?