【发布时间】:2016-04-17 09:04:24
【问题描述】:
我正在开发一个 Windows CLR 表单,以便为我作为控制台程序处理的一些代码创建 GUI 交互。
当我在代码的控制台部分包含标头时,我的两个标头可以很好地协同工作,但是当我尝试将它们包含在 form 中时,它们会导致以下结果:
librarytest.obj:错误 LNK2005:_SeqWait 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_KillDLL 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_SetSinFreq2 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_ConnectDirect 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_GetDevice 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_SetSinFreq_Fine2 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_Connect 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_TacOnTimeForTAction 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_SetSinFreq1 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_GetLastEAIError 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_SetGain 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_Disconnect 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_ReadFWVer 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_SetSinFreq_Fine1 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_SetSigSrc 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_ClosePort 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_ShowDebugInfo 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_OpenPort 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_DiscoverDevices 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_TacOnTime 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_PulseOnTime 已在 Gesture_Elicitor.obj 中定义
librarytest.obj:错误 LNK2005:_tactorhandle 已在 Gesture_Elicitor.obj 中定义
....
有趣的问题是,我的一个标题(“wiimote.h”,来自 WiiYourself 项目)如果仅包含一个标题,则可以正常工作。问题在于“tactor_cHeader.h”,它连接到它的 .dll 。有问题的缩写代码如下:
#ifndef TACTOR_H_
#define TACTOR_H_
using namespace std;
#include <windows.h>
...
typedef int (*ConnectDirectPtr)(char*name, int type);
typedef int (*TacOnTimePtr)(int cidx, int board, int tacNum, int durMilli, bool returnifprocessing);
typedef int (*SetFreqPtr)(int cidx, int board, int freq, bool returnifprocessing);
typedef int (*KillDLLptr)();
typedef int (*SeqWaitPtr)(int cidx, int board, int waitTime, bool returnifprocessing);
...
ConnectDirectPtr ConnectDirect;
TacOnTimePtr TacOnTimeForTaction;
SetFreqPtr SetSinFreq1;
SetFreqPtr SetSinFreq2;
KillDLLptr KillDLL;
SeqWaitPtr SeqWait;
...
HINSTANCE tactorhandle = NULL;
inline int InitTactorDLL()
{
tactorhandle = LoadLibrary("Tactor_DLL.dll");
if (tactorhandle == 0)
return -1;
SeqWait = (SeqWaitPtr)GetProcAddress(tactorhandle, "SeqWait");
ConnectDirect = (ConnectDirectPtr)GetProcAddress(tactorhandle, "ConnectDirect");
TacOnTime = (TacOnTimePtr)GetProcAddress(tactorhandle, "TacOnTime");
SetSinFreq1 = (SetFreqPtr)GetProcAddress(tactorhandle, "SetSinFreq1");
SetSinFreq2 = (SetFreqPtr)GetProcAddress(tactorhandle, "SetSinFreq2");
KillDLL = (KillDLLptr)GetProcAddress(tactorhandle, "KillDLL");
}
#endif
那么这个标题与我的表单不匹配的原因是什么?
【问题讨论】:
-
你能把代码(和文件名)贴在
SeqWait、SetSinFreq2、KillDLL定义的地方吗? -
我编辑了原始文档以符合您的要求 @CristiFati 。这有帮助吗?
标签: visual-studio-2010 visual-c++