Qt:找到多个定义的符号
Qt : multiple defined symbols found
这是一个 Qt 项目,一旦构建,就会生成一个 dll AnTS_Core.dll
所以我有:
AnTs_Core.cpp
#include <windows.h>
#include "Globals.h" // my global values
extern "C"
{
__declspec(dllexport) void load();
}
void load()
{
mainDispatcher = new Dispatcher();
}
包含所有主要对象的全局头文件作为全局(因为我想从另一个对象调用对象方法):
Globals.h:
#ifndef GLOBALS_H
#define GLOBALS_H
#include "AnTS_Types.h"
#include "Dispatcher.h"
#ifdef __cplusplus
extern "C"
{
#endif
Dispatcher *mainDispatcher;
#ifdef __cplusplus
}
#endif
#endif // GLOBALS_H
调度程序:头文件
#ifndef DISPATCHER_H
#define DISPATCHER_H
#include "AnTS_Types.h"
#include "Device.h"
#include <list>
#include <windows.h>
class Dispatcher
{
public:
Dispatcher();
~Dispatcher();
private:
std::list<Device*> _devices;
};
#endif
Dispatcher.cpp :
#include "Dispatcher.h"
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string.h>
#include <dirent.h>
#include <regex>
#include "Device/DEV_Struct.h"
Dispatcher::Dispatcher()
{
}
和设备(Dispatcher 包含设备列表)
Device.h
#ifndef DEVICE_H
#define DEVICE_H
#include <windows.h>
#include "Device/DEV_Struct.h"
#include "AnTS_Types.h"
#define ANTS_DEVICE_NAME_LENGHT 64
class Device
{
public:
Device(char*);
~Device();
};
#endif // DEVICE_H
Device.cpp
#include "../Includes/Device.h"
#include <string.h>
#include <iostream>
#include <cstdio>
#include "Globals.h"
Device::Device(char* dllPath)
{
}
错误是:
LNK2005 _mainDispatcher already defined in AnTS_Core.cpp.obj
LNK1169 one or more multiply defined symbols found
当我在 Device.cpp 中注释行 #include "Globals.h"
时,错误消失了。但我想从 device.cpp 文件访问全局变量(例如另一个 Dispatcher 或另一个对象)。
你的 Globals.h
中有 Dispatcher *mainDispatcher;
,这样每个包含这个 header 的编译单元都会创建它自己的这个符号的实例。在 Globals.h
中声明 extern Dispatcher *mainDispatcher;
,并在 AnTs_Core.cpp
中添加 Dispatcher *mainDispatcher;
。这样你就有了一个AnTs_Core.cpp
编译单元的符号,但其他人会通过extern声明看到它。
所以,这是一个经典的 declaration vs definition 问题 - 您已经在 header 中定义了变量 mainDispatcher
,因此包含此 header 的每个编译单元都会结束使用定义,您想要的是将 header 中的变量声明为 extern
(这只会通知包含 header 的每个编译单元该变量存在):
#ifndef GLOBALS_H
#define GLOBALS_H
#include "AnTS_Types.h"
#include "Dispatcher.h"
#ifdef __cplusplus
extern "C"
{
#endif
extern Dispatcher *mainDispatcher;
#ifdef __cplusplus
}
#endif
#endif // GLOBALS_H`
并且您应该将实际定义 Dispatcher* mainDispatcher
放入您的 .cpp
文件之一。
这是一个 Qt 项目,一旦构建,就会生成一个 dll AnTS_Core.dll 所以我有:
AnTs_Core.cpp
#include <windows.h>
#include "Globals.h" // my global values
extern "C"
{
__declspec(dllexport) void load();
}
void load()
{
mainDispatcher = new Dispatcher();
}
包含所有主要对象的全局头文件作为全局(因为我想从另一个对象调用对象方法):
Globals.h:
#ifndef GLOBALS_H
#define GLOBALS_H
#include "AnTS_Types.h"
#include "Dispatcher.h"
#ifdef __cplusplus
extern "C"
{
#endif
Dispatcher *mainDispatcher;
#ifdef __cplusplus
}
#endif
#endif // GLOBALS_H
调度程序:头文件
#ifndef DISPATCHER_H
#define DISPATCHER_H
#include "AnTS_Types.h"
#include "Device.h"
#include <list>
#include <windows.h>
class Dispatcher
{
public:
Dispatcher();
~Dispatcher();
private:
std::list<Device*> _devices;
};
#endif
Dispatcher.cpp :
#include "Dispatcher.h"
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string.h>
#include <dirent.h>
#include <regex>
#include "Device/DEV_Struct.h"
Dispatcher::Dispatcher()
{
}
和设备(Dispatcher 包含设备列表)
Device.h
#ifndef DEVICE_H
#define DEVICE_H
#include <windows.h>
#include "Device/DEV_Struct.h"
#include "AnTS_Types.h"
#define ANTS_DEVICE_NAME_LENGHT 64
class Device
{
public:
Device(char*);
~Device();
};
#endif // DEVICE_H
Device.cpp
#include "../Includes/Device.h"
#include <string.h>
#include <iostream>
#include <cstdio>
#include "Globals.h"
Device::Device(char* dllPath)
{
}
错误是:
LNK2005 _mainDispatcher already defined in AnTS_Core.cpp.obj
LNK1169 one or more multiply defined symbols found
当我在 Device.cpp 中注释行 #include "Globals.h"
时,错误消失了。但我想从 device.cpp 文件访问全局变量(例如另一个 Dispatcher 或另一个对象)。
你的 Globals.h
中有 Dispatcher *mainDispatcher;
,这样每个包含这个 header 的编译单元都会创建它自己的这个符号的实例。在 Globals.h
中声明 extern Dispatcher *mainDispatcher;
,并在 AnTs_Core.cpp
中添加 Dispatcher *mainDispatcher;
。这样你就有了一个AnTs_Core.cpp
编译单元的符号,但其他人会通过extern声明看到它。
所以,这是一个经典的 declaration vs definition 问题 - 您已经在 header 中定义了变量 mainDispatcher
,因此包含此 header 的每个编译单元都会结束使用定义,您想要的是将 header 中的变量声明为 extern
(这只会通知包含 header 的每个编译单元该变量存在):
#ifndef GLOBALS_H
#define GLOBALS_H
#include "AnTS_Types.h"
#include "Dispatcher.h"
#ifdef __cplusplus
extern "C"
{
#endif
extern Dispatcher *mainDispatcher;
#ifdef __cplusplus
}
#endif
#endif // GLOBALS_H`
并且您应该将实际定义 Dispatcher* mainDispatcher
放入您的 .cpp
文件之一。