今天修改代码时遇到一些问题,同一工程的某个子目录中的A.c文件想要调用根目录下的某个B.c文件中的函数,但是出现了链接错误。
仔细分析了下代码,确认了一下一些内容
(1)B.h中对于需要调用的函数做出了声明。
extern BOOL IsSingleMode();
(2)B.c中对于该函数也进行了实现。
BOOL IsSingleMode()
{
return bSingleMode;
}
(3)A.c中包含了B.h头文件
#include "..\B.h"
结果出现了如下的错误:
option_setting.obj : error LNK2001: unresolved external symbol _bSingleMode
百思不得其解,上网查资料之后发现该问题是非常常见的一种错误,但是网上对于解决方法的说明大多过于抽象。对于该问题,还有一个比较奇特的现象:同样有一个宏定义的参数(非函数)能够实现调用而不出错。
咨询了同事,他给的理由是生成B.c所在的路径生成的是exe,A.c所在的路径生成的是dll文件。我们的程序是先编译A.c所在的dll,然后再编译B.c,所以B.c无法调用A.c,但是反过来可以调用。
不知道他说的有没有道理,而且就算他说的是正确的,但是为什么宏定义的参数可以实现调用,而函数,全局变量等却不能实现调用呢?
望各位大神解答疑惑,感激不尽。