我在使用 Qt Creator 时遇到一个奇怪的问题,无法使用 Visual Studio 重现。 对于我正在处理的项目,我必须使用第三方 dll,为此,我还需要在代码中包含一个适当的头文件。然而,即使头文件有一组
#ifndef VICON
#define VICON
//...
#endif // VICON
guard ,一旦我将 header 包含在多个源代码文件中(直接或间接),我就会收到以下链接错误:
mainwindow.obj:-1: 错误:LNK2005: "class std::basic_ostream > & __cdecl ViconDataStreamSDK::CPP::operator<<(class std::basic_ostream > &,class ViconDataStreamSDK::CPP: :String const &)"(??6CPP@ViconDataStreamSDK@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV23@ABVString@01@@Z) 已在 main.obj 中定义
debug\Beetle_01.exe:-1: 错误:LNK1169:找到一个或多个多重定义符号
我可以为您提供源代码,但这似乎无关紧要,即使我没有从这个 DLL 中调用任何内容,只要相关的头文件出现在多个地方,我就会收到上述错误。如果头文件仅位于一个位置,则没有问题,然后我可以调用其内容,一切都会按预期工作。
以下是我将 dll 包含在 .pro 文件中的方法,希望这是正确的方法:
INCLUDEPATH += .
win32:LIBS += ViconDataStreamSDK_CPP.lib
(相关的lib、dll、h文件都在当前目录下) 顺便说一句,我正在 Windows 7 上编码。
最佳答案
在我看来,该库可能会定义 operator<<
函数在头文件中,但忘记将其标记为 static
或inline
。这意味着它将在包括头文件在内的所有源文件中定义,并且您将收到您所描述的链接器错误。
关于c++ - Qt Creator - 当 dll 的 header 出现在多个位置时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9664053/