LNK2019错误,求大神给讲讲原理

xuan_general 发布于 2012/07/26 11:14
阅读 276
收藏 0

WsnDevice.h文件

#ifndef _WSN_DEVICE_COMMUNICATION_HEADER_
#define _WSN_DEVICE_COMMUNICATION_HEADER_

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

#ifdef WSNDEVICE_EXPORTS
#define WSN_API __declspec(dllexport)
#else
#define WSN_API __declspec(dllimport)
#endif

typedef void* HWSNSVR; // 服务句柄
typedef void* HWSNPORT; // 通讯端口句柄

typedef unsigned long WSNTIME;  // 时标,四字节无符号整形,存储从2000-1-1 00:00:00到现在的秒数
typedef unsigned long WSNADDR; // 地址,四字节无符号整形

typedef const char* WSNPSZ; // 字符串常量
typedef long WSNBOOL; // 布尔,四字节有符号整形
typedef long WSNINT; // 整形,四字节有符号整形
typedef unsigned long WSNUINT; // 无符号整形,四字节无符号整形

// 当前版本号
// v1002 增加水位震动湿度避雷器等传感器
// v1001 支持TCP服务端模式
// v1000 支持串口注册基站
#define WSN_DEVICE_VERSION 0x1002

#define WSN_TRUE 1;
#define WSN_FALSE 0;

// 传感器数据类型
#define WSN_TYPE_TEMPERATURE 1
#define WSN_TYPE_HUMIDITY  2
#define WSN_TYPE_WATER   3
#define WSN_TYPE_SHAKE   4
#define WSN_TYPE_MAGNETSWITCH 5
#define WSN_TYPE_ARRESTER  10
#define WSN_TYPE_TOTALCURRENT 11
#define WSN_TYPE_BASECURRENT 12
#define WSN_TYPE_HAR3CURRENT 13
#define WSN_TYPE_RESISTIVECURRENT 14
#define WSN_TYPE_RESISTIVEPHASE 15
#define WSN_TYPE_TOTALVOLTAGE 20
#define WSN_TYPE_BASEVOLTAGE 21
#define WSN_TYPE_HAR3VOLTAGE 22

// 传感器数据
typedef struct WsnData
{
 short vbat;  // 电压,存储值 = 实际值 * 1000;
 short state; // 状态,保留
 short type;  // 类型,目前为WSN_TYPE_TEMPERATURE
 union
 {
  short temperature; // 温度 存储值 = 实际摄氏度 * 10 + 2730;
  short humidity;  // 湿度 存储值 = 实际百分比(%) * 10 + 1;
  short water;  // 水位 存储值 = 实际水位值(干燥=0,浸水=1) + 1;
  short phase;  // 相角 存储值 = 实际角度值 * 10 + 1;
  short shake;  // 震动状态 存储值 = 实际震动状态(平静=0,震动=1) + 1;
  short switching; // 开关状态 存储值 = 实际开关状态(关=0,开=1) + 1;
  long arrester;  // 避雷器动作次数 存储值 = 实际次数 + 1;
  long current;  // 电流 存储值 = 实际电流(微安) + 1;
  long voltage;  // 电压 存储值 = 实际电压(毫伏) + 1;

  long val32;   // 备用
  short nc[5];  // 备用
 } data; // 值
} WSNDATA;

// 接收缓冲,注意成员都是指针,如果不想获取某项信息,可以置为空指针
typedef struct WsnRecv
{
 WSNADDR* sensorId; // ID,如果一个传感器4位编号是01.25.80.24(十六进制),那么此值为:0x2480
 WSNTIME* timestamp; // 时标,从2000-1-1 00:00:00到现在的秒数
 WSNDATA* data;  // 数据
 WSNADDR* devAddr; // 所属设备通讯地址,由组地址ADDRG与单元地址ADDRU组成,值为:ADDRG*0x100 + ADDRU
 WSNADDR* devId;  // 所属设备组编号,一般组成传感器4位编号的高2位,前面的示例中,此值为:0x2501
} WSNRECV;

// 时间结构体,用于表述更为可读的时间
typedef struct WsnTimeStruct
{
 short year;
 short month;
 short day;
 short hour;
 short minute;
 short second;
} WSNTIMESTRUCT;


// 获取版本号
WSN_API WSNUINT WSN_GetVersion(void);

// 实例化并初始化通讯服务
WSN_API HWSNSVR WSN_NewServer(void);
// 退出通讯服务,并释放资源
WSN_API void WSN_ReleaseServer(HWSNSVR hSvr);

// 注册设备到指定端口,必需在启动通讯服务前完成,不可与WSN_RegisterCom同时使用
WSN_API WSNBOOL WSN_RegisterDevice(HWSNSVR hSvr, WSNINT comNo, WSNINT comBaud, WSNADDR devAddr, WSNUINT devId);

// 注册通讯TCP服务,模块将在指定端口监听并接受各基站TCP连接,将自动扫描TCP连接上所有基站
// 返回通讯端口句柄,必需在启动通讯服务前完成
WSN_API HWSNPORT WSN_RegisterTcpServer(HWSNSVR hSvr, WSNINT port);

// 注册通讯串口,模块将在指定串口监听并接受各基站数据,将自动扫描串口上所有基站
// 返回通讯串口句柄,必需在启动通讯服务前完成
// comSetting举例: "9600, n, 8, 1"
WSN_API HWSNPORT WSN_RegisterCom(HWSNSVR hSvr, WSNINT comNo, WSNPSZ comSetting);

// 启动通讯服务
WSN_API WSNBOOL WSN_StartServer(HWSNSVR hSvr);
// 停止通讯服务
WSN_API void WSN_StopServer(HWSNSVR hSvr);

// 读取数据,本接口函数可阻塞
// timeout表示本操作可以等待的时间,如果在指定时间内没有读取到数据,将超时,并返回false
// timeout小于0将一直阻塞直到读取到数据或者服务停止
WSN_API WSNBOOL WSN_Read(HWSNSVR hSvr, WSNRECV* recv, WSNINT timeout);

// 同步所有设备时间为系统当前时钟
WSN_API WSNBOOL WSN_SyncTime(HWSNSVR hSvr);

// 时间转换函数,将时间戳转换为可读的时间结构
WSN_API WSNBOOL WSN_Timestamp2Struct(WSNTIME* ts, WSNTIMESTRUCT* tss);


#ifdef __cplusplus
}
#endif // __cplusplus

#endif // _WSN_DEVICE_COMMUNICATION_HEADER_
我的Test.cpp
#include <stdio.h>
#include <Windows.h>
#include "WsnDevice.h"
#include "rtdb_api.h"
//From WsnDevice

void main(void)
{
 //Connect
 unsigned long SR_er = -1;
 char SR_server[80];
 strcpy(SR_server,"127.0.0.1");
 SR_er = RT_connect(SR_server,6327);//默认IP,端口
 if (er != 0){
  printf("connect server : %s failed!\n",SR_server);
  return 0;
 }
 else
  printf("connect succeed......\n");
 //Login
 RT_PRIV_GROUP SR_priv;
 SR_er = RT_login("sa","sa",&SR_priv);
 if (er != 0){
  printf("login server : %s failed!\n",SR_server);
  return 0;
 }
 else
  printf("login succeed......\n");
 //MyType
 float SR_f = 0.0;//默认类型为RT_FLOAT32
 long SR_pt;
 long SR_datatime;
 long SR_status;
 WSNDATA data = {0};
 WSNADDR id = 0;
 WSNRECV recv = {0};
 WSNTIME timestamp = 0;
 recv.data = &data;
 recv.sensorId = &id;
 recv.timestamp = &timestamp;
 int counter = 0;
 //Read Data
 HWSNSVR hSvr = NULL;
 do
 {
  // 检查模块版本
  WSNUINT ver = WSN_GetVersion();
  if(WSN_DEVICE_VERSION != ver)
  {
   printf("通讯模块版本不一致\n");
   break;
  }
  // 请求并实例化通讯服务
  hSvr = WSN_NewServer();
  if(NULL == hSvr)
  {
   printf("实例化通讯服务失败\n");
   break;
  }
  // 注册基站到通讯服务
        // 此处示例打开串口1,波特率9600,基站地址1.1,组编号11.1
        //TODO 如果需要修改基站信息,请在此处修改,支持同时注册多个基站
#if 0
  // 使用确定的基站注册接口
  if(!WSN_RegisterDevice(hSvr, 1, 9600, 0x0101, 0x1011))
  {
   printf("注册基站失败\n");
   break;
  }
#else
  // 使用基站扫描
  if(!WSN_RegisterCom(hSvr, 1, "9600,n,8,1"))
  {
   printf("注册基站失败\n");
   break;
  }
#endif
  if(!WSN_RegisterTcpServer(hSvr, 2000))
  {
   printf("监听2000端口失败\n");
   break;
  }
  // 启动服务
  if(!WSN_StartServer(hSvr))
  {
   printf("无法启动通讯服务\n");
   break;
  }
  // 准备接收
  printf("开始接收\n");
  // 循环接收,实际应用中应该在线程中循环接收
  while(true)
  {
   //读取数据,超时2秒
   if(WSN_Read(hSvr, &recv, 2000))
   {
    //转换时标为可读的结构体
    WSNTIMESTRUCT ts;
    WSN_Timestamp2Struct(&timestamp, &ts);
    //接收到温度数据,打印出来
    if(WSN_TYPE_TEMPERATURE == data.type)
    {
     printf("温度: %04X, %.2f, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.temperature - 2730) / 10,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
     //RECV分析
     SR_f = (float)(data.data.temperature - 2730) / 10;//温度
     SR_pt = WC_GetPt();//待完善
     SR_datatime = 0;//当前UTC时间
     SR_datatime = WC_GetDataTime();//待完善
     SR_status = RTS_GOOD;
     //写入数据库
     SR_er = RTS_PutSnapshot( SR_pt, SR_datatime, SR_f, SR_status);
     if (er != 0){
      printf("PutSnapshot : %d failed!\n",SR_pt);
     }
     else
      printf("PutSnapshot succeed......\n");
    }
    else if(WSN_TYPE_HUMIDITY == data.type)
    {
     printf("湿度: %04X, %.2f, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.humidity - 1) / 10,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_WATER == data.type)
    {
     printf("水位: %04X, %d, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      data.data.water - 1,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_SHAKE == data.type)
    {
     printf("震动: %04X, %d, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      data.data.shake - 1,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_MAGNETSWITCH == data.type)
    {
     printf("开关: %04X, %d, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      data.data.switching - 1,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_ARRESTER == data.type)
    {
     printf("避雷器: %04X, %d, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      data.data.arrester - 1,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_TOTALCURRENT == data.type)
    {
     printf("总电流: %04X, %.2fmA, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.current - 1) / 1000,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_BASECURRENT == data.type)
    {
     printf("基波电流: %04X, %.2fmA, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.current - 1) / 1000,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_HAR3CURRENT == data.type)
    {
     printf("3次谐波电流: %04X, %.2fmA, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.current - 1) / 1000,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_RESISTIVECURRENT == data.type)
    {
     printf("阻性电流: %04X, %.2fmA, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.current - 1) / 1000,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_RESISTIVEPHASE == data.type)
    {
     printf("阻性电流相角: %04X, %.1f度, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.phase - 1) / 10,
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_TOTALVOLTAGE == data.type)
    {
     printf("总电压: %04X, %.2fmV, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.voltage - 1),
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_BASEVOLTAGE == data.type)
    {
     printf("基波电压: %04X, %.2fmV, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.voltage - 1),
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    else if(WSN_TYPE_HAR3VOLTAGE == data.type)
    {
     printf("3次谐波电压: %04X, %.2fmV, %.2f, %04d-%02d-%02d %02d:%02d:%02d\n", id,
      (double)(data.data.voltage - 1),
      (double)data.vbat / 1000, ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second);
    }
    //其他类型
    else
    {
     //目前不支持的数据类型
    }
    counter = 0;
   }
   //演示用,30秒内没接收到数据,退出
   else
   {
    printf(".");
    if(counter++ > 15)
    {
     break;
    }
   }
  }
 }while(false);
 //释放服务句柄
 if(NULL != hSvr)
 {
  WSN_ReleaseServer(hSvr);
 }
}

报错:

1>正在编译...
1>WC_Test.cpp
1>c:\users\administrator\desktop\wc\new_test\new_test\wc_test.cpp(13) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\string.h(74) : 参见“strcpy”的声明
1>正在链接...
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_ReleaseServer,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__RTS_PutSnapshot@16,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_Timestamp2Struct,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_Read,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_StartServer,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_RegisterTcpServer,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_RegisterCom,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_NewServer,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__WSN_GetVersion,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__RT_Login@12 ,该符号在函数 _main 中被引用
1>WC_Test.obj : error LNK2019: 无法解析的外部符号 __imp__RT_Connect@8 ,该符号在函数 _main 中被引用
1>C:\Users\Administrator\Desktop\WC\New_Test\Debug\New_Test.exe : fatal error LNK1120: 11 个无法解析的外部命令
1>生成日志保存在“file://c:\Users\Administrator\Desktop\WC\New_Test\New_Test\Debug\BuildLog.htm”
1>New_Test - 12 个错误,1 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

加载中
0
xuan_general
xuan_general
问题以解决呵呵
返回顶部
顶部