基于open62541、CMake与Conan生成自定义OPC-UA信息模型遇问题
使用Conan构建的open62541配合CMake生成自定义OPC-UA信息模型的问题解决
问题场景
通过Conan安装open62541包后,使用VS17编译项目时,调用open62541提供的ua_generate_nodeset_and_datatypes CMake宏无法生成自定义命名空间的.c和.h文件,同时出现警告MSB8065: Custom build for item x succeeded, but specified output x has not been created.。但手动执行nodeset_compiler.py命令可以成功生成目标文件:
python C:/.conan/62d0ea/1/res/tools/nodeset_compiler/nodeset_compiler.py --types-array=UA_TYPES --existing C:/.conan/29713a/1/src/deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml --xml myNS.xml myNS
问题排查与修复步骤
1. 校验路径变量的正确性
CMake宏依赖的open62541_TOOLS_DIR和open62541_NODESET_DIR必须与手动命令中的路径完全匹配:
- 检查
${CONAN_USER_OPEN62541_tools_dir}是否正确指向nodeset_compiler.py所在目录,可在CMakeLists.txt中添加打印验证:message(STATUS "open62541_TOOLS_DIR: ${CONAN_USER_OPEN62541_tools_dir}") - 确认
open62541_NODESET_DIR指向的目录下,Schema/Opc.Ua.NodeSet2.xml文件存在,避免路径错误导致无法加载标准节点集。
2. 补充宏的依赖节点集参数
手动命令中通过--existing指定了依赖的标准节点集,但原CMake宏仅设置了DEPENDS_TYPES,缺少对应配置。需在ua_generate_nodeset_and_datatypes中添加DEPENDS_NS参数:
ua_generate_nodeset_and_datatypes( NAME "myNamespace" FILE_NS "${PROJECT_SOURCE_DIR}/myNS.xml" DEPENDS_TYPES "UA_TYPES" # 对应手动命令的--existing参数 DEPENDS_NS "${open62541_NODESET_DIR}/Schema/Opc.Ua.NodeSet2.xml" )
3. 对齐输出前缀配置
手动命令的输出前缀是myNS,而宏中NAME设为myNamespace,需确认宏是否自动映射输出文件名。若存在差异,添加OUTPUT_PREFIX参数强制指定输出前缀:
ua_generate_nodeset_and_datatypes( NAME "myNamespace" FILE_NS "${PROJECT_SOURCE_DIR}/myNS.xml" DEPENDS_TYPES "UA_TYPES" DEPENDS_NS "${open62541_NODESET_DIR}/Schema/Opc.Ua.NodeSet2.xml" OUTPUT_PREFIX "myNS" )
4. 排查构建命令细节
开启CMake详细输出,对比宏生成的Python命令与手动命令的差异:
- 在CMakeLists.txt中添加
set(CMAKE_VERBOSE_MAKEFILE ON) - 查看VS构建日志中的自定义命令执行记录,检查是否存在参数传递错误、Python环境差异或权限问题。
修正后的完整CMake示例
include(open62541Macros) # 验证Conan工具路径 message(STATUS "CONAN_USER_OPEN62541_tools_dir: ${CONAN_USER_OPEN62541_tools_dir}") set(open62541_TOOLS_DIR ${CONAN_USER_OPEN62541_tools_dir}) # 指向正确的标准节点集目录 set(open62541_NODESET_DIR "C:/.conan/29713a/1/src/deps/ua-nodeset") # 生成自定义命名空间与数据类型 ua_generate_nodeset_and_datatypes( NAME "myNamespace" FILE_NS "${PROJECT_SOURCE_DIR}/myNS.xml" DEPENDS_TYPES "UA_TYPES" DEPENDS_NS "${open62541_NODESET_DIR}/Schema/Opc.Ua.NodeSet2.xml" OUTPUT_PREFIX "myNS" )
内容的提问来源于stack exchange,提问作者kkivi
相关产品推荐
相关产品推荐

