Qt:找到多个定义的符号

时间:2015-04-30 09:50:55

标签: c++ qt symbols

这是一个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

Dispatcher:头文件

#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已在AnTS_Core.cpp.obj中定义

     

LNK1169找到一个或多个多重定义的符号

当我在Device.cpp中注释行#include "Globals.h"时,错误消失了。但我想从device.cpp文件访问全局变量(例如,另一个Dispatcher或另一个对象)。

2 个答案:

答案 0 :(得分:1)

所以,这是一个经典的declaration vs definition问题 - 你已经在标题中定义了变量mainDispatcher,因此包含这个标题的每个编译单元都有一个定义,你想要的是将标头中的变量声明为extern(这将仅通知包含此变量存在的标头的每个编译单元):

#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个文件中。

答案 1 :(得分:0)

您的Dispatcher *mainDispatcher;中有Globals.h,这样每个包含此标头的编译单元都会创建自己的此符号实例。在extern Dispatcher *mainDispatcher;中声明Globals.h,并在Dispatcher *mainDispatcher;中添加AnTs_Core.cpp。这样,AnTs_Core.cpp编译单元将有一个符号,但其他符号将通过extern声明来查看。