一、解读SDK源代码(略)
二、构建此项目的代码结构
通过下述链接运行出来SDK例子的结构如下图
OPC Client第7讲(CMake):CMake教程(动/静态库区别举例),运行SDK的例子-优快云博客
但是有些源代码需要隐藏(比如其它的几个SDK例子就不需要),而且如果让客户按照上述例子进行配置比较麻烦。
所以只留下例子client_examples及其需要的源代码,修改CMakeLists.txt,把其需要的配置都自动勾选上,不用再一个一个地设置。最后变成如下图的结构:
1、创建新的文件夹,进行前置准备
创建空文件夹,命名为“opc_test”。
参考下述链接,把client_examples需要的SDK源代码文件夹(即Source文件夹)复制粘贴进去,文件夹更名为lib
OPC Client第7讲(CMake):CMake教程(动/静态库区别举例),运行SDK的例子-优快云博客
创建src和include文件夹,把SDK源代码的client_examples文件夹里的.h和.cpp文件
2、修改顶层的CMakeLists.txt
目的:把其需要的配置都自动勾选上,不用再一个一个地设置
1>设置SDK源代码绝对路径
即下述链接五、4、
OPC Client第7讲(CMake):CMake教程(动/静态库区别举例),运行SDK的例子-优快云博客
1》set(... CACHE PATH ...)
这里我们使用 set
并指定 CACHE PATH
来创建一个可以被用户在 CMake GUI 中看到并修改的路径变量。
# 设置 FLEX_SDK_SOURCE_LOCATION 变量,提供一个默认路径
set(FLEX_SDK_SOURCE_LOCATION "${CMAKE_SOURCE_DIR}/lib" CACHE PATH "Path to Flex SDK source")
${CMAKE_SOURCE_DIR}
是指向包含顶级CMakeLists.txt
文件的源代码目录的变量。这意味着无论你在哪个子目录下运行 CMake,它都会基于项目的根目录来解析这个相对路径。CACHE
变量:用于存储那些需要用户配置或希望在整个构建系统中持久化的值。这些变量可以在cmake-gui
或者ccmake
(CMake 的文本用户界面)中被看到并修改。- 除了
PATH
类型外,CMake 支持多种类型的缓存条目,每种类型都有其特定的用途和显示方式。
- 除了
2》修改/lib/SDK_Code下的CMakeLists.txt的路径
2>勾选需要的配置宏
即下述链接五、7、
OPC Client第7讲(CMake):CMake教程(动/静态库区别举例),运行SDK的例子-优快云博客
1》option()
option()
命令用于定义布尔类型的选项(即开关),它接受的参数是选项名称、描述和默认值(通常是 ON
或 OFF
)
- 当你使用
set()
直接在CMakeLists.txt
中设置变量值时,这些设置是硬编码的,不会显示为可调整的选项在cmake-gui
中。- 因为
cmake-gui
显示的是那些通过option()
或者add_compile_definitions()
等命令明确声明为用户可配置的选项。
- 因为
- 对于路径或者字符串类型的变量,应该使用 1》的
set()
命令而不是option()
打开cmake-gui,开始构建项目。
然而,输入配置选项(例如“UASDK_EXAMPLE_CLIENT_MT_CONSOLE”)后,发现这个选项还是没有勾选上。说明上图的CMakeLists.txt还是有问题。
2》修改CMakeLists.txt,确保1》中的配置项能自动选中
以“UASDK_EXAMPLE_CLIENT_MT_CONSOLE”配置项为例,其它的配置项修改完全类似。
在上图的CMakeLists.txt中搜索“UASDK_EXAMPLE_CLIENT_MT_CONSOLE”,查看其每个地方的代码。
把这个选项OFF的地方删去。
其它的配置项修改同理修改。
避免“Too many platforms selected.”报错,需要关闭“UASDK_WITH_PLATFORM_WINDOWS_MULTI_THREADED_NATIVE”配置项,如下图。
3》修改子目录名称
3、修改/src路径下的CMakeLists.txt
1>一定要添加头文件路径!(目录)
include_directories(...)
是全局设置,而 target_include_directories(...)
是针对特定目标的,更加安全和模块化。
2>增加CONFIGURE_DEPENDS命令选项:
- GLOB和GLOB_RECURSE 支持
CONFIGURE_DEPENDS
- CMake 不会在文件变化时自动重新运行配置(configure)阶段,所以你每次添加或删除文件后需要手动重新运行 CMake(比如点击
Configure
在cmake-gui
中),否则新文件不会被加入构建。 -
CONFIGURE_DEPENDS
的作用就是告诉 CMake:“这个文件依赖于某些输入文件,如果输入变了,请重新生成它。”
4、使用CMake-Gui构建
只需要按照下图的4步进行操作
打开解决方案,将其设为启动项目,运行代码
三、导入wxwidgets库+实现初始界面的相关代码
即导入下述链接里的代码
OPC Client第4讲(wxwidgets):实现项目的初始界面代码-优快云博客
OPC Client第5讲(wxwidgets):初始界面的事件处理;按照配置文件初始化界面的内容_wxopc-优快云博客
1、导入wxwidgets库的相关代码
在/include文件夹下增加命名空间,把SDK原有的代码放进uasdk文件夹,如下图
原有的"main.cpp"改为"client_main.cpp",把wxwidgets的相关代码导入,如下图
2、导入wxwidgets库:使用 vcpkg 导入多个包,并在 CMake 中通过 find_package()
来查找它们
没有学CMake之前,方法用的下述链接五、
【法1>导入属性表】
现在学习了CMake,只需要修改/src/CMakeLists.txt
【法2>手动指定库文件和头文件路径】、
即下述链接二、
OPC Client第1讲:环境配置,需要用到的各个工具_windows 10企业版 opcclient环境搭建-优快云博客
【法3>【推荐】使用 vcpkg 导入多个包,并在 CMake 中通过 find_package()
来查找它们】
1>使用 vcpkg 安装 wxWidgets
vcpkg 及其安装 wxWidgets 的相关步骤之前已经做过,如下图:
2>修改 CMakeLists.txt:查找并链接 wxWidgets
1》设置 vcpkg 工具链
《1》设置CMAKE_PREFIX_PATH变量、
wxWidgets_DIR变量
按道理都不需要设置的,因为代码中使用了 vcpkg 的 toolchain 文件。设置了CMAKE_TOOLCHAIN_FILE后会自动导入这两个变量的具体路径。
但是第一次使用CMake-Gui重新构建项目时,报错说找不到wxWidgets库。所以才显式设置了这两个变量的路径。
《2》为什么都必须在 project() 之前设置?——为了防止vcpkg
集成失效
1)project()
是 CMake 初始化项目的核心命令。
- 它会确定编译器类型、平台信息、项目名称等。
- 它还会尝试查找和加载依赖库(通过
find_package()
或其他机制),这时就需要正确的路径设置。
2)如果在此之后设置 CMAKE_TOOLCHAIN_FILE
:
-
编译器可能已被错误检测(如默认的 MSVC 而非
vcpkg
的交叉编译链)。 -
find_package
会使用标准系统路径搜索依赖,而非vcpkg
的库。
3)vcpkg
的特殊要求:
vcpkg
的工具链文件必须 覆盖默认的系统路径。CMake 在 project()
时固化搜索路径,提前设置确保 vcpkg
的路径优先级最高。
2》查找并链接 wxWidgets:find_package
find_package(wxWidgets CONFIG REQUIRED COMPONENTS core base):
《1》使用 CONFIG
模式是因为你通过 vcpkg 安装了 wxWidgets,并且它提供了 wxWidgetsConfig.cmake文件
-
wxWidgetsConfig.cmake
文件位于vcpkg/installed/<triplet>/share/wxwidgets/
目录下- 其中
<triplet>
是你安装时指定的平台标识符,如x64-windows
- 路径:D:\Vcpkg\vcpkg\installed\x64-windows\share\wxwidgets
- 如下图,可以看到其提供了许多库/组件。目前只需要使用wx::core 和 wx::base 库。
- 其中
《2》COMPONENTS
后面列出你需要的具体模块(如 core、base、html、aui 等)。
《3》成功后会导出 wx::core
, wx::base
等目标供链接使用。
3>将 wxWidgets 链接到你的目标
3、读取Configuration.json文件?????????????????
下面分开到两个CMakeLists.txt的写法报错,都写在src/CMakeLists.txt的方法也报错。在CMake-gui的界面就能看出少了资源。(见五、)
configure_file
是 CMake 中一个非常常用的命令,用于复制文件并替换其中的内容。它常用于生成配置头文件(如 config.h
)或其它需要根据构建环境动态生成的文件。
${RESOURCE_FILE}
应该是一个代表你要复制的资源文件名的变量。COPYONLY
参数告诉configure_file
命令仅复制文件而不执行任何配置修改(例如,不对文件中的 CMake 变量或生成器表达式进行替换)
这个文件忘加了,
在CMakelist中加上,
重新配置!在bin/Debug目录下会再生成一个Configuration.json
4、使用CMake-Gui重新构建项目
先把client_console_t.cpp和client_main.cpp里的内容注释掉,再运行项目。
报错,只有helper_t.h这部分代码有问题,如下图。【把这部分的代码换成师傅写的就不会报错。但是为了理解代码,不要整体替换,慢慢修改。见四、】
四、完整运行项目
1、修改helper_t.h
1>添加之前写过的split、gettime函数
2>按照报红的错误,导入相关.h头文件
师傅的代码没加,不知道为什么师傅的代码能运行??
3>SDK源代码的helper_t.h里面,还是有问题
2、注释掉的SDK源代码里也报错
把client_console_t.cpp和client_main.cpp里的内容取消注释,报错如下图:
解决:如下图,src/CMakeLists.txt
中的头文件路径。
五、完整按照师傅的代码结构运行
1、等于二、
1>lib文件夹 = 二、2、1>
代码都没有修改,只是直接去掉了”UASDK_FLEX_SDK_SOURCE_LOCATION“变量,直接导入/SDK_Code下的CMakeLists.txt
2>勾选需要的配置宏 = 二、2、2> ?????????
完全等于 二、2、2>的操作,只是把不需要的都删去了。
【此处应该不对,应该还有额外的操作,见下图师傅的配置多了WX和X和Z】
在二、2、2>的操作中,自己只是把不需要的设置了OFF,剩余的没有删去。