编译open62541:
这里是在win10系统VS2019+QT5.15.2 开发OPC UA
首先下载open62541,这里使用的是open62541-1.3.9,前提是已经安装好cmake
1.使用cmake-gui编译:
在下载的open62541中新建一个名为 build 的文件夹
打开cmake-gui,我的 .exe 路径 E:\Tool\cmake\bin ,如下图
where is the source code 栏填入 open62541 的路径,
where to build the binaries 栏填入新建的 build 文件夹的路径
点击左下角的Configure按钮,弹出下图界面:
将VS2015改成VS2019,点击 Finish 按钮
红线处必须勾选
然后点击Generate按钮,出现两个done表示成功
此时去build文件夹内查看出现了 open62541.sln文件
打开.sln文件或者点击 Open Project 按钮,出现以下界面
右键点击解决方案,生成解决方案,无报错
此时去build文件夹内查看出现了 open62541.h 和 open62541.c 文件
在下图路径内还出现了 open62541.lib 文件
至此编译完成
2.VS2019配置:
此时新建项目
#include “open62541.h” 后生成解决方案时时会出现一系列LNK2019无法解析的外部符号报错:
错误 “error LNK2019: 无法解析的外部符号 _WSAStartup@8,该符号在函数 _main 中被引用”
这是由于ws2_32.lib 文件的缘故,去搜索下载一个ws2_32.lib放到项目文件夹内,下面两种方法只能使用一个
法一:
直接在相应头文件的下方添加一句编译器指令,别的什么操作也就不用管了:
#pragma comment(lib, "WS2_32.lib")
或者使用法二:
项目属性—>链接器---->输入---->附加依赖项---->在最前面添加“ws2_32.lib”
此时便不再报错,使用如下客户端代码测试也不会报错,即表示成功。
int testOPC::Practice()
{
UA_Client* client = UA_Client_new();//创建Client类
UA_ClientConfig_setDefault(UA_Client_getConfig(client));
//连接到服务器
UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
if (retval != UA_STATUSCODE_GOOD)//如果返回的状态不是”好的“
{
UA_Client_delete(client);
return (int)retval;//返回错误状态
}
/* Read the value attribute of the node. UA_Client_readValueAttribute is a
* wrapper for the raw read service available as UA_Client_Service_read. */
UA_Variant value; // 创建一个容器,可以包含任何类型的标量值和数组
UA_Variant_init(&value);//初始化容器
/* NodeId of the variable holding the current time */
const UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
retval = UA_Client_readValueAttribute(client, nodeId, &value);
if (retval == UA_STATUSCODE_GOOD && UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME]))
{
UA_DateTime raw_date = *(UA_DateTime*)value.data;
UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "date is: %u-%u-%u %u:%u:%u.%03u\n",
dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
}
/* Clean up */
UA_Variant_clear(&value);
UA_Client_delete(client); /* Disconnects the client internally */
system("pause"); // 防止控制台一闪而过
return EXIT_SUCCESS;
}
本文借鉴了以下文章
windows网络编程:visual studio出现 ”error LNK2019: 无法解析的外部符号 _WSAStartup@8,该符号在函数 _main 中被引用“问题,怎么解决