语境
我正在开发一个旨在向设备发送某些命令的项目。每个设备都可以连接一个 dll(例如 deviceADll.h、deviceBDll.h),而这些 Dll 不是我编写的,我也不能以任何方式修改它们。我负责将 DeviceB 集成到项目中,对项目结构的改动很小。我知道结构可能不是最佳的和/或设计良好的,所以我愿意就此问题提出建议作为最后的解决方案。
由于设备非常相似,所有 Dll 函数都具有相同的名称,并且通常具有相同的原型。
也正因为如此,我创建了一个父类(Device_ts.h),DeviceA_ts.h 和 DeviceB_ts.h 从中继承(我也有一个用于设备的工厂类,但我认为它与我的问题无关) .
问题
当我尝试包含两个 Dll 时出现问题:项目编译,但我得到一个
Warning 60 warning LNK4006: Connect@12 already defined in DeviceA.lib(DeviceA.dll); second definition ignored C:\project_path\DeviceB.lib(DeviceB.dll) Project_Name
其次是
Warning 61 warning LNK4006: __imp__Connect@12 already defined in DeviceA.lib(DeviceA.dll); second definition ignored C:\project_path\DeviceB.lib(DeviceB.dll) Project_Name
和一个
Warning 62 warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library C:\project_path\DeviceB.lib(DeviceB.dll) Project_Name
有没有人遇到过类似的情况?DeviceB.h
我应该忽略这些警告还是因为它们的定义被忽略而无法调用函数?
我正在使用 Visual Studio 2010,Device_ts.h
我正在编写的库是一个静态库,并且所有项目的参数(例如 /MD、包含目录、依赖项、MFC 等)都是根据我在针对这个问题的研究中发现的正确设置的。
代码
包含和代码如下所示(我将只显示导致警告的函数之一,因为我在 50 个函数上遇到相同的错误):
设备ADll.h
#ifndef DEVICEA_H__
#define DEVICEA_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
namespace DeviceA
{
// some struct definition that don't cause the linker warnings
//...
// function definitions
extern "C" HANDLE PASCAL EXPORT Connect( HANDLE h_devA, const char *ip);
// ...
} // namespace DeviceA
设备BDll.h
#ifndef DEVICEB_H__
#define DEVICEB_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
namespace DeviceB
{
// some struct definition that don't cause the linker warnings
//...
// function definitions
extern "C" HANDLE PASCAL EXPORT Connect( HANDLE h_devB, const char *ip);
// ...
} // namespace DeviceB
设备_ts.h
#ifndef DEVICE_FCT_H_
#define DEVICE_FCT_H_
#ifndef EXPORT
#define EXPORT
#endif
#if _MSC_VER > 1000
#pragma once
#endif
#include "DeviceADll.h"
#include "DeviceBDll.h"
class CDevice {
public:
virtual BOOL Connect(char *ip_addr) = 0;
};
#endif DEVICE_FCT_H_