我已经为这个bug编写了一个最小的案例,它生成了EXTRN语句: EXTRN _。?AU_anc @ 8:PROC
这是代码 - 有人可以发现我做错了什么。当我有三个以THRCOMP开头的语句和3个相应的proc_ent语句时,它会编译第一个和最后一个OK,第二个语句会产生上述错误。
struct _anchor
{
int(*svc_addr) (int, void * vptr, ...);
void *reserved;
};
typedef _anchor anchor;
#define THRCOMP extern "C" __declspec(dllexport) int __stdcall
struct _proc_ent {
_proc_ent *succ;
char proc_name[32];
char comp_name[200];
int (__stdcall *faddr) (_anchor anch);
void *proc_block; // used as a temporary placeholder by thxbnet
void * label_ptr; // points to a label for subnets
bool trace;
bool composite;
bool must_run;
};
typedef _proc_ent proc_ent;
#define TRACE true
#define COMPOS true
#define NULL 0
THRCOMP ThFileWt(_anchor anch);
THRCOMP ThCopyNL(_anchor anch);
THRCOMP ThFileRd(_anchor anch);
proc_ent P0 = { NULL, "Read", "ThFileRd", ThFileRd, NULL, NULL,
TRACE, !COMPOS };
proc_ent P1 = { &P0, "Show", "ThFileWt", ThFileWt, NULL, NULL,
TRACE, !COMPOS };
proc_ent P2 = { &P1, "Copy", "ThCopyNL", ThCopyNL, NULL, NULL,
TRACE, !COMPOS };
如果有人能够阐明这一点,或者给我一个解决方法,那就太好了。提前谢谢!
答案 0 :(得分:0)
您实际上是否为ThFileRd()
et al?
使用编写的代码我得到了p0,p1等的未定义符号,它们似乎对应于除最后一个之外的所有函数名称:
1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThFileRd@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _.?AU_anc@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThFileWt@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThCopyNL@8
当我添加proc_ent P3 = { &P2, "Wibble", "ThWibble", ThWibble, NULL, NULL, TRACE, !COMPOS };
和相应的THRCOMP定义时,得到了这个。
这几乎是我期望看到的,因为这些功能没有代码;但意外的是最后一个函数的名称更改(显然是从ThWibble
到.?AU_anc
)。
重新排列THRCOMP定义的顺序没有任何区别。
如果我注释掉p3和p2,那么名称更改将移至p1:
1>Win32Project1.obj : error LNK2001: unresolved external symbol _ThFileRd@8
1>Win32Project1.obj : error LNK2001: unresolved external symbol _.?AU_anc@8
但是如果我将定义更改为包含函数体,例如THRCOMP ThWibble(_anchor anch) {return 0;}
,则代码编译时没有任何错误。我正在使用VS2015社区,并将代码粘贴到Win32 DLL项目中。
我不知道_.?AU_anc@8
来自哪里,以及为什么这个值应该只对应于最后一个pN定义。我已经想过如果p2定义有问题,那么无论是否定义了p3,错误都会保留,同样如果p1定义没有任何错误,它也不会突然出现当p2被注释掉时,会出错。