手头上的任务需要将不同摄像头厂商的SDK集成到同一的平台下,拿到文档后发现不同厂商SDK的结构体定义都大同小异,就是有一些结构体名字相同,内容却有些差别;
以海康威视和亿维为例:
海康威视:
typedef struct{
long nWidth;
long nHeight;
long nStamp;
long nType;
long nFrameRate;
DWORD dwFrameNum;
}FRAME_INFO;亿维:
ypedef struct
{
long nWidth;
long nHeight;
long nStamp;
long nType;
long nFrameRate;
long bIsVideo;
int  nLinseSize[4];
}FRAME_INFO; 将各自的头文件包含进来后,编译时会产生定义冲突的警告,且编程时也会产生混乱,比如访问亿维的 bIsVideo 变量却产生一个变量不存在的错误想请教各位遇到此类问题时是怎样处理的,前提当然是不可能要求各个厂商更改其结构定义

解决方案 »

  1.   

    这个问题还真有点纠结,如果某一个的结构体用的不多,可以直接修改它给的SDK么,虽然是个笨办法,但是好像这个问题确实比较难弄
      

  2.   

    在这些文件的定义里加个NAMESPACE名空间,使用时根据名空间区别开来。
      

  3.   

    如果你要使用不可预知的 SDK 和 库,最好使用动态加载。
    类似于 COM 。
      

  4.   

    最好的办法是,把不同厂家的SDK分别封装成不同的类或DLL或LIB。
      

  5.   

    谢谢各位的回复
     
    <ream238>的方法是我最先尝试的,对于大厂商可以这么实现,但是现在高清摄像机厂商太多太泛滥了,有些厂商的SDK命名空间后,编译就出错,只好作罢了<Saleayas>的方法如何解决结构定义冲突的问题呢?  现在库的加载并没有问题
      

  6.   

    <yhp1888>再做一层封装,不失为一个办法,谢谢! 有没有其他的方法呢   有几十个厂商的SDK  全部封装一遍也是件体力活
      

  7.   

    创建一个接口库。提供一个统一的接口。
    这样,你的程序和 SDK 的库就隔离了。在这个接口库中,使用动态加载。
    使用命名空间 namespace 隔离各个 SDK。
    但是,必须动态加载 SDK 库,数据定义可以使用命名空间隔离。
    但是导出函数如果不用动态加载,在连接到 lib 的时候,会提示函数符号冲突。我用这个方法,Hook 到 DirectX 的游戏中,DirectX 的各个版本就是这样冲突的。